Go语言中通道channel的示例分析
发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,这篇文章将为大家详细讲解有关Go语言中通道channel的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Go语言通道基础概念1.channel产生背景线
千家信息网最后更新 2025年02月20日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安全错误
数据库的锁怎样保障安全
nginx用的什么数据库
接内网的服务器外网如何访问
迪肯大学网络安全硕士
数据库应用技术笔试考试
网络安全技术人才缺少
网络安全的概念简答题
蔬菜分拣系统软件开发
船舶清洁能源数据库
中学网络安全手抄报图片
亚马逊新云数据库服务
秀山计算机网络技术职业学校
游戏服务器空间
服务公司无线网络安全防护
51网络安全生态标准
信息网络安全监察专业专科
山东大久网络技术有限公司
安卓播放软件开发
中国台湾oa软件开发服务介绍
江西考试数据库
和平精英 网络安全法
如何写网络安全公约
服务器power740价格
万盈网络技术有限公司
物理和网络安全评估分析
皮卡糖 苹果糖服务器
高二网络技术与应用 目录
深度学习比软件开发还简单
服务较好的语音对讲软件开发
计算机网络技术色盲
计算机网络技术重点培养