首页 > 资讯 > > 正文

GO通道:无缓冲通道与缓冲通道

来源:博客园 2023-06-18 17:31:33

转载请注明出处:


(相关资料图)

1.通道定义  

在多个协程之间进行通信和管理,可以使用 Go 语言提供的通道(Channel)类型。通道是一种特殊的数据结构,可以在协程之间进行传递数据,从而实现协程之间的通信和同步。多个协程可以同时读写同一个通道,通过通道来进行数据的传递和共享。

通道遵循先入先出(First In First Out)的原则,保证收发数据的顺序。通道是一个特殊的数据类型,在使用之前必须定义和创建通道变量,定义通道的语法如下:

var name chan type

语法格式说明如下:

1)var是Go语言关键字,用于定义变量。

2)name是通道变量名称,可自行命名。

3)chan是Go语言关键字,将变量定义为通道类型。

4)type是通道存放的数据类型。

通道定义之后,还需要使用关键字make创建通道,通道的创建语法如下:

name := make(chan type, num)

语法格式说明如下:

1)name是通道变量名称,可自行命名。

2)make是Go语言关键字,用于创建通道。

3)chan type的chan是Go语言关键字,type是通道能存放的数据类型。

4)num是通道存放数据的数量上限。

在实际编程中,我们直接使用关键字make创建通道即可使用,这样能省去定义通道的过程,示例代码如下:

// 定义和创建通道    var ch chan string    ch = make(chan string)    // 直接创建通道,无须定义    ch := make(chan string)

通道创建之后,使用通道完成写入和读取数据操作。在通道里面写入和读取数据需要由<-操作符实现,使用说明如下:

// 构建通道    ch := make(chan string)    // 往通道写入数据    ch <- "Hello"    // 从通道获取数据,赋予变量s    s := <- ch
2.无缓冲通道

无缓冲通道是 Go 语言中一种常见的通道类型,也称为同步通道或阻塞通道。无缓冲通道的特点是在发送和接收数据时,必须有另外一个协程同时进行相反的操作,否则会阻塞当前协程。 具体来说,无缓冲通道的特点如下:

发送和接收操作是同步的,即发送操作必须等待接收操作完成后才能继续执行,接收操作也必须等待发送操作完成后才能继续执行。

无缓冲通道的容量为 0,即只有在发送和接收操作同时进行时才能传递数据,否则会阻塞当前协程。

无缓冲通道的数据传递是按照先进先出的顺序进行的,即发送的数据会按照发送的顺序被接收。 无缓冲通道可以用于协程之间的同步和通信,例如在生产者和消费者模式中,可以使用无缓冲通道来传递数据,从而保证生产者和消费者之间的同步和互斥。同时,无缓冲通道的使用也可以避免数据竞争问题,从而提高程序的安全性和可靠性。

通道是通过关键字make创建的,在创建过程中,如果没有设置参数num,则视为创建无缓冲通道。无缓冲通道(Unbuffered Channel)是指在获取数据之前没有能力保存数据的通道,这种类型的通道要求两个Goroutine同时处于执行状态才能完成写入和获取操作。

如果两个Goroutine没有同时准备,某一个Goroutine执行写入或获取操作将会处于阻塞等待状态,另一个Goroutine无法执行写入或获取操作,程序将会提示异常,这种类型的通道执行写入和获取的交互行为是同步,任意一个操作都无法离开另一个操作单独存在。

当我们使用无缓冲通道的时候,必须注意通道变量的操作,确保程序中有两个或两个以上的Goroutine同时执行通道的读写操作,读写操作必须是一读一写,不能只读不写或只写不读,示例如下:

// 只写入数据,不读取    ch := make(chan string)    ch <- "Tom"    fmt.Println("wait goroutine")    // 只读取数据,不写入    ch := make(chan string)    <- ch    fmt.Println("wait goroutine")

通道数据只写入不读取或者只读取不写入都会提示fatal error: all goroutines are asleep–deadlock异常,如果需要实现通道数据获取超时检测,可以使用关键字select实现。

如果程序中仅有一个Goroutine,使用通道读写数据也会导致异常,比如在主函数main()中对通道写入数据,再读取通道数据,示例如下:

package main    import (        "fmt"    )    func main() {        // 构建通道        ch := make(chan string)        // 写入通道数据        ch <- "Tom"        // 读取通道数据        <-ch        fmt.Println("wait goroutine")    }

如果在发送和接收数据时出现异常,则会引发程序异常。例如,如果我们在发送数据之前关闭通道,则会引发一个运行时异常。为了避免这种情况的发生,我们可以使用 defer语句在函数退出之前关闭通道。例如:

func main() {    ch := make(chan int)    defer close(ch) // 使用 defer 关闭通道    go func() {        fmt.Println("开始发送消息...")        ch <- 1        fmt.Println("消息发送完成。")    }()    fmt.Println("开始接收消息...")    msg := <-ch    fmt.Printf("接收到的消息是:%d\n", msg)    fmt.Println("消息接收完成。")}
3.带缓冲通道

带缓冲通道(Buffered Channel)是在被获取前能存储一个或者多个数据的通道,这种类型的通道并不强制要求Goroutine之间必须同时完成写入和获取。当通道中没有数据的时候,获取动作才会阻塞;当通道没有可用缓冲区存储数据的时候,写入动作才会阻塞。

在无缓冲通道的基础上,只要为通道增加一个有限大小的存储空间就能形成带缓冲通道。带缓冲通道在写入时无须等待获取即可再次执行下一轮写入,并且不会发生阻塞,只有当存储空间满了才会发生阻塞。同理,如果带缓冲通道中有数据,获取时将不会发生阻塞,直到通道中没有数据可读时,通道才会阻塞。

从通道的定义角度分析,带缓冲和无缓冲通道的区别在于参数num。创建通道的时候,如果没有设置参数num,则默认参数值为0,通道为无缓冲通道,所以写入和获取数据必须同时进行才不会因阻塞而异常;如果参数num大于0,则写入和获取数据无须同步执行,因为通道有足够的空间存放数据。

由于带缓冲通道没有读写同步限制,我们可以在同一个Goroutine中执行多次写入和获取操作,具体示例如下:

package main    import "fmt"    func main() {        // 创建一个3个元素缓冲大小的整型通道        ch := make(chan int, 3)        // 查看当前通道的大小        fmt.Println(len(ch))        // 发送3个整型元素到通道        for i := 0; i < 3; i++ {             ch <- i        }        // 查看当前通道的大小        fmt.Println(len(ch))        for i := 0; i < 3; i++ {             fmt.Println(<-ch)        }        // 查看当前通道的大小        fmt.Println(len(ch))        // 查看当前通道的容量        fmt.Println(cap(ch))    }

上述代码的说明如下:

1)通过for执行了3次循环,每次循环将变量i写入通道,然后通过3次循环从通道获取数据并输出。

2)通道写入和读取数据的时候,使用len()函数获取通道已有的数据量,判断当前通道存储的数据量是否达到上限,这样可以防止程序在运行时提示异常。

3)使用cap()函数能获取通道的容量大小,即获取创建通道make()的参数num的大小。带缓冲通道在很多特性上和无缓冲通道类似,无缓冲通道可以看作长度为0的带缓冲通道。

根据这个特性,带缓冲通道在下列情况下会发生阻塞:

1)带缓冲通道的存储数据达到上限时,再次写入数据将发生阻塞而导致异常。

2)带缓冲通道没有存储数据时,获取数据将发生阻塞而导致异常。

Go语言为什么对通道要限制长度?因为多个Goroutine之间使用通道必然存在写入和获取操作,这种模式类型的典型例子为生产者消费者模式。如果不限制通道长度,当写入数据速度大于获取速度,内存将不断膨胀直到应用崩溃。因此,限制通道的长度有利于约束数据生产速度,生产数据量必须在数据消费速度+通道长度的范围内,这样才能正常地处理数据。

x
推荐阅读

GO通道:无缓冲通道与缓冲通道

2023-06-18 17:31:33

华安证券开户怎么样 华安证券如何开户

2023-06-18 17:01:11

快播:蜀鄙二僧原文译文及注释(蜀鄙二僧原文翻译)

2023-06-18 16:04:38

北京朝阳区端午系列活动拉开帷幕

2023-06-18 15:41:54

李想两千字长文CUE友商,看似学习,实则“显摆”?

2023-06-18 15:01:51

防城港√三兄弟因征地偿款引发的矛盾纠纷!结果……

2023-06-18 13:09:06

如何使用SMART原则帮自己赚到人生的第一个1000万?-当前观点

2023-06-18 12:08:24

世界快讯:全球车企第一高!马斯克曝特斯拉市值上涨主要动力

2023-06-18 11:30:13

2023粤港澳车展:新款捷豹F-PACE售价47.2万起 快资讯

2023-06-18 10:49:01

热门:照片为证!12处地标见证春城百年变迁

2023-06-18 09:59:43
相关新闻

GO通道:无缓冲通道与缓冲通道

2023-06-18 17:31:33

华安证券开户怎么样 华安证券如何开户

2023-06-18 17:01:11

快播:蜀鄙二僧原文译文及注释(蜀鄙二僧原文翻译)

2023-06-18 16:04:38

北京朝阳区端午系列活动拉开帷幕

2023-06-18 15:41:54

李想两千字长文CUE友商,看似学习,实则“显摆”?

2023-06-18 15:01:51

防城港√三兄弟因征地偿款引发的矛盾纠纷!结果……

2023-06-18 13:09:06

如何使用SMART原则帮自己赚到人生的第一个1000万?-当前观点

2023-06-18 12:08:24

世界快讯:全球车企第一高!马斯克曝特斯拉市值上涨主要动力

2023-06-18 11:30:13

2023粤港澳车展:新款捷豹F-PACE售价47.2万起 快资讯

2023-06-18 10:49:01

热门:照片为证!12处地标见证春城百年变迁

2023-06-18 09:59:43

安徽省启动气象灾害(暴雨)III级应急响应_当前看点

2023-06-18 09:48:53

小区来了新主任(关于小区来了新主任介绍)

2023-06-18 09:14:58

热推荐:佩斯科夫:俄罗斯仍在与世界大部分地区合作

2023-06-18 08:50:12

环球速讯:西北工业大学与两江新区合作“开花结果”“重庆造”航空航天关键产品已用在国产大飞机上

2023-06-18 08:06:01

“富贵不能淫,贫贱不能移”,跳桥救人小哥转赠15万,打脸了谁?|全球信息

2023-06-18 07:14:55

每日快讯!迎端午、备暑运 复兴号家族全面“体检”

2023-06-18 06:12:13

世界播报:军事网站有哪些_军事网站哪个比较好

2023-06-18 05:04:42

家庭菜谱做法大全视频_家庭菜谱做法大全

2023-06-18 01:21:05

环球百事通!悠悠寸草心第三部题目是什么_悠悠寸草心还会有第3部吗相关介绍简介

2023-06-17 23:00:01

不期而爱 Ae&Pete 归来 70 归程-2

2023-06-17 22:02:51

2023苍南县各高中录取分数线 世界资讯

2023-06-17 21:01:00

消息!关于地球水资源的建议书

2023-06-17 20:52:31

世界新动态:怎么看透一个人的心思_说一个人心思深沉是什么意思

2023-06-17 20:17:34

全球今日报丨安道民

2023-06-17 19:13:02

焦点要闻:红袖添香日记网_红袖情感日记

2023-06-17 18:12:51

武威文旅推介招商活动在南京成功举办

2023-06-17 17:42:35

天天快资讯丨肺部疼是什么意思_肺部疼说明什么

2023-06-17 17:12:28

镜见·多彩阿拉善丨鸟 舞动生命的精灵

2023-06-17 16:30:41

天天新资讯:欧洲议会议员发问 凭什么干涉中国香港事务?

2023-06-17 15:36:44

天天微头条丨中央财政对试点城市给予定额奖励 中小企业数字化转型城市试点工作将开展

2023-06-17 14:46:05

今日热议:30岁男性防脱发育发哪个牌子最有效?属实被震撼住了!

2023-06-17 14:11:45

鲁甸县气象台发布大风蓝色预警信号【Ⅳ级/一般】【2023-06-17】_世界热推荐

2023-06-17 13:20:23

爬泳的身体姿势特点_爬泳

2023-06-17 12:45:45

阿里总裁谈马云近况:他在东京教书 今日讯

2023-06-17 11:49:40

当前播报:起凡三国争霸全图_起凡三国争霸免费全图

2023-06-17 11:06:22

动态:国乒公布斯洛文尼亚挑战赛名单,马龙带新人打资格赛,球迷感动!

2023-06-17 10:26:56

蓝色协议错误代码01069封号解决办法分享

2023-06-17 10:03:34

当前要闻:重庆1号线璧山站是终点吗 重庆1号线璧山站通了没

2023-06-17 09:37:07

绝世唐门:给亲闺女下禁制?霍雨浩想跟老婆亲热还要找岳父解锁? 天天微头条

2023-06-17 09:03:07

中邮睿信增强债券型证券投资基金基金经理变更公告

2023-06-17 08:19:14

李凡慕千凝小说免费阅读最新

2023-06-17 07:59:14

WTI 7月原油期货收涨1.64%

2023-06-17 06:59:47

华燕房盟控股股东上海华燕投资控股(集团)有限公司已被列为失信被执行人

2023-06-17 06:31:26

【全球聚看点】6月16日基金净值:贝莱德中国新视野混合A最新净值0.7138,涨1.18%

2023-06-17 06:03:27

公司搞活动策划方案(公司搞活动买奖品)

2023-06-17 03:01:27

全球速看:618装机指北,i家显卡是否值得入手?

2023-06-17 01:25:27

需等半小时以上,报告称 Win10 安装 6 月更新会长时间卡在“清理”环节

2023-06-17 00:02:48

子宫切除了还能正常过性生活吗_子宫切除 世界热消息

2023-06-16 22:49:47

长沙市公共卫生救治中心一期预计年底完工交付 环球观焦点

2023-06-16 22:08:49

市州观察丨5条精品旅游线路背后,资阳文旅的“谋”与“动”|环球视点

2023-06-16 22:01:45

天天滚动:龙猫巴士盒子纸模型图纸自取

2023-06-16 20:57:00

天天短讯!存货小规模纳税人和一般纳税人的区别

2023-06-16 20:38:42

英语中的过去式是什么意思_hurt的过去式是什么意思-天天资讯

2023-06-16 20:02:24

鲍信_关于鲍信简述

2023-06-16 19:48:07

世界热文:2023职称入户广州年龄条件

2023-06-16 19:27:50

环球看热讯:7天优品酒店_七天快捷酒店

2023-06-16 18:44:47

世界观天下!去年今日此门中的下一句是(去年今日此门中的下一句)

2023-06-16 18:30:48

环球快看:官方:上田绮世因伤退出本期日本队,无缘出战秘鲁&无候补人选

2023-06-16 17:59:56

政策送基层 西安经开区开展异地就医专题宣讲活动|环球热推荐

2023-06-16 17:51:45

全球简讯:天河客运站 时刻表(关于天河客运站 时刻表的基本详情介绍)

2023-06-16 17:10:17

环球精选!10岁女孩晒谢娜生图!点赞“像老年版杨幂”评论,遭网暴骂到求饶?

2023-06-16 16:58:53

看点:C罗返葡参加国家队集训 备战欧洲杯预选赛

2023-06-16 16:21:09

全球热资讯!川音开启系列展演活动 将持续至大运会开幕

2023-06-16 16:19:12

武汉二本院校录取分数线_武汉二本院校

2023-06-16 16:02:44

焦点滚动:2023年环境评价师《技术导则与标准》历年真题精选0616_环境评价师

2023-06-16 15:23:09

从u盘拷贝的3dmax怎么安装_3dmax怎么安装

2023-06-16 15:03:05

给你们mp3下载地址_给你们mp3下载

2023-06-16 15:01:21

微资讯!国资委:央企要以上市公司为平台开展并购重组

2023-06-16 14:04:02

从“化工围江”到“绿色护江”长江沿线兴起产业新地标|环球视点

2023-06-16 13:56:42

环球播报:解码厦门“智慧城中村平台”创新应用之路——湖里街道基层社会治理现代化样本

2023-06-16 13:14:29

全球今亮点!重返未来1999大娱乐至上怎么样

2023-06-16 12:57:16

《王者荣耀》推出亚运版本 凸显杭州特色 世界播资讯

2023-06-16 12:43:38

世界热头条丨印第安人的舞蹈特点_印第安人的服饰特点是什么

2023-06-16 12:15:46

热议:1/2盎司扇形生肖银币价格(2023年06月16日)

2023-06-16 11:45:12

环球新消息丨我国迎来工业互联网规模化应用新阶段

2023-06-16 11:33:54

买猫抓板送的猫薄荷能吃吗(猫咪吸多了猫薄荷有害吗)

2023-06-16 11:22:14

全球快看:白云山拜博士:别让情绪掌控你 学会照顾自己的情绪

2023-06-16 11:05:02

《抄写员巴特尔比》:严肃的艺术努力导致自我毁灭式的失败?

2023-06-16 10:51:12

穿汉服不能进迪士尼乐园?当事人删帖并回复:无意挑起争端

2023-06-16 10:38:28

全球短讯!欧股周四收盘涨跌互现 欧央行宣布加息25个基点

2023-06-16 10:17:00

中药板块走强 贵州百灵涨超7%_新视野

2023-06-16 10:13:05

环球视点!万控智造:6月15日融资买入924.59万元,融资融券余额6040.48万元

2023-06-16 10:00:09

中兴Axon 50 Ultra上架预约 机皇6299 天天简讯

2023-06-16 09:35:16

今日热文:全市首个 湖里区政务服务中心在线客服上线

2023-06-16 09:14:54

今日讯!万豪在华开业酒店500家;端午民宿预订同比增长524%;国旅联合拟收购海际购公司100%股权 | 迈点早报

2023-06-16 09:20:54

bpm系统是什么意思_bpm是什么意思 天天播资讯

2023-06-16 08:40:54

贾跃亭竟然以这种方式在国内“现身”|第一财经汽车日评-天天热点

2023-06-15 19:21:13

北京再次上演“土拍大战”:三宗地块吸金110亿元,均触顶成交

2023-06-15 19:03:03

首都在线:与燧原科技联合开发的AIGC文生图的场景 可满足需要美术设计制作场景客户需求_当前快报

2023-06-15 18:10:06

全球快播:2022内蒙古兴安盟公安机关招聘警务辅助人员面试有关事宜的公告

2023-06-15 17:55:39

怎么追求女孩子容易成功(怎么追求女孩子) 世界资讯

2023-06-15 17:13:09

ming-webreport viewer_ming webreport viewer 世界快讯

2023-06-15 17:05:20

Stack Overflow 发布 2023 年度报告:JavaScript 位列榜首

2023-06-15 16:13:14

因未按时履行给付义务,贾跃亭被中国证监会限制高消费

2023-06-15 16:02:23

伊朗亮高超导弹,中国家电企业背锅,美国破防就用制裁找场子?

2023-06-15 15:10:45

全球最新:炸伤摆烂,1分钱不留!国米核心免签巴黎还狡辩,张康阳错信了他

2023-06-15 14:42:52

中南建设6月15日盘中涨停 全球资讯

2023-06-15 14:06:56

环球焦点!日本角川出版公司奥运项目负责人因东京奥运会贿赂案获刑

2023-06-15 13:41:33

世界观天下!河南局部突破40℃ !后天雨水来“退烧”

2023-06-15 12:56:36

Bing抢先ChatGPT发布的识图功能-环球快讯

2023-06-15 11:57:19