Go语言中通道channel的示例分析
发表于:2024-10-16 作者:千家信息网编辑
千家信息网最后更新 2024年10月16日,这篇文章将为大家详细讲解有关Go语言中通道channel的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Go语言通道基础概念1.channel产生背景线
千家信息网最后更新 2024年10月16日Go语言中通道channel的示例分析
这篇文章将为大家详细讲解有关Go语言中通道channel的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、Go语言通道基础概念
1.channel产生背景
线程之间进行通信的时候,会因为资源的争夺而产生竟态问题,为了保证数据交换的正确性,必须使用互斥量给内存进行加锁,go语言并发的模型是CSP,提倡通过通信共享内存,而不是通过共享内存而实现通信,通道恰巧满足这种需求。
2.channel工作方式
channel
类似与一个队列,满足先进先出的规则,严格保证收发数据的顺序,每一个通道只能通 过固定类型的数据如果通道进行大型结构体、字符串的传输,可以将对应的指针传进去,尽量的节省空间
二、通道使用语法
1.通道的声明与初始化
//定义一个通道对象使用,其中int可以换为自己需要的类型 var a chan int //初始化只有一个位置的通道(第一个参数代表通道类型,第二个参数代表通道有几个位置) //位置存满后新的数据将存不进来(阻塞) a = make(chan int,1)
2.将数据放入通道内
取出数据使用操作符 <-操作符右是输入变量,操作符左是通道代表数据流入通道内
代码如下:
// 声明一个通道 var a chan int a <- 5
3.从通道内取出数据
取出数据也使用操作符 <-操作符右是通道,操作符左是接受变量
代码如下:
//声明一个通道类型 var a chan int fmt.Println("未初始化的通道", a) a = make(chan int) // wg.Add(1) go func(a chan int) { // defer wg.Done() for { x := <-a fmt.Println("接收到了数据:", x) } }(a)
4.关闭通道close
如果通道重复关闭或者关闭一个没有初始化的通道就会抛出错误
close(a)//a为待关闭的通道
在并发函数中一次关闭通道代码如下:
// 互斥锁对象var once sync.Once//并发函数//这个函数的目的是将a通道内数据乘以10发送到通道b内func f2(a <-chan int, b chan<- int) { defer wg.Done() for { x, ok := <-a if !ok { break } fmt.Println(x) b <- x * 10 } // 确保b通道只关闭一次 once.Do(func() { close(b) })}
三、单项通道及通道的状态分析
1.单项输出通道
var b <-chan int
2.单项输入通道
var b chan<- int
示例函数:
//单项通道一般做函数参数,作为一种规范防止通道混用//此函数完成的功能是将a内的数据乘以10放入通道b内func f2(a <-chan int, b chan<- int) { for { x, ok := <-a if !ok { break } fmt.Println(x) b <- x * 10 }}
3.通道的状态
channel | nil未初始化 | 空通道 | 满通道 | 非空 |
---|---|---|---|---|
接收 | 阻塞 | 阻塞 | 接收值 | 接收值 |
发送 | 阻塞 | 发送值 | 阻塞 | 发送值 |
关闭 | panic | 关闭成功 | 关闭成功 | 关闭成功 |
关闭后返回的数据 | panic | 返回0值 | 数据读完后返回零值 | 数据读完返回零值 |
四、通道死锁原因分析
注意以下情况:
在使用通道的时候,从以上表格可知有时会进入阻塞状态,结合waitGroup,如果在主函数等待使用通道的函数执行结束,而使用通道的函数并且通道陷入阻塞状态,如果有其他函数对其进行唤醒则不会死锁,如果没有其他函数可以对其进行唤醒则会抛出死锁异常。
关于"Go语言中通道channel的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
通道
数据
函数
阻塞
操作符
语言
分析
单项
状态
类型
示例
成功
代码
代表
内存
参数
篇文章
死锁
通信
位置
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机网络技术发展最新阶段
软件开发市场分析论文
网络安全和信息化专业职称
蚌埠软件开发多少钱
魔兽世界怀旧70数据库
网络安全须用理性去守护
德甲2021赛季中柱数据库
服务器后台如何开展职业规划
股票专业软件开发
网页证书软件开发
软件开发毕业设计三项文档
山东网络安全协会理事长
无法激活服务器暂时不可用请尝试
华为的软件开发月薪
郑州应用软件开发哪家实惠
阿里企业邮箱服务器地址
php如何统一数据库
服务器行业交多少税
火鸟数据库导出excel
在网上怎么学习网络技术
启东泰畅网络技术有限公司
甘肃hp服务器虚拟化哪家好
xp系统的服务器管理器
网络安全编程范例
广西网络技术服务有限公司
护苗网络安全颗课
软件开发核心指标
徐汇区网络技术咨询售价
数据库软件 推荐
aveye云服务器打不开网址