科百科
当前位置: 首页 范文大全

golang channel详细解析(简介channel常见用法完成goroutin通信)

时间:2023-08-16 作者: 小编 阅读量: 3 栏目名: 范文大全

channel信道的英文是channel,在golang当中的关键字是chan。我们先来看它的使用,首先是定义一个chan,还是老规矩,通过make关键字创建。用法也很简单,我们在通过make创建chan的时候多加上一个参数表示容量即可,和我们之前创建切片的道理很类似。close当我们对信道使用结束之后,可以通过close语句将它关闭。Close这个操作只能在生产端进行,消费端如果close信道会引发一个panic。

golang channel详细解析?今天是golang专题的第14篇文章,大家可以点击上方的专辑回顾之前的内容,我来为大家科普一下关于golang channel详细解析?以下内容希望对你有帮助!

golang channel详细解析

今天是golang专题的第14篇文章,大家可以点击上方的专辑回顾之前的内容。

今天我们来看看golang当中另一个很重要的概念——信道。我们之前介绍goroutine的时候曾经提过一个问题,当我们启动了多个goroutine之后,我们怎么样让goroutine之间保持通信呢?

要回答这个问题就需要用到信道。

channel

信道的英文是channel,在golang当中的关键字是chan。它的用途是用来在goroutine之间传输数据,这里你可能要问了,为什么一定得是goroutine之间传输数据呢,函数之间传递不行吗?

因为正常的传输数据直接以参数的形式传递就可以了,只有在并发场景当中,多个线程彼此隔离的情况下,才需要一个特殊的结构传输数据。

Chan看起来比较怪,在其他语言当中基本没有出现过,但是它的原理和使用都非常简单。

我们先来看它的使用,首先是定义一个chan,还是老规矩,通过make关键字创建。我们之前也提过,golang当中的一个设计原则就是能省则省,能简单则简单。从这个make关键字就看得出来,它可以创建的东西太多了,既可以创建一个切片,也可以创建map,还可以创建信道。

所以当我们要创建一个chan的时候,可以通过make实现。

Ch := make(chan int)

我们在chan后面跟上一个类型,表示这个信道传输的数据类型。如果你想要传输任何类型呢,那可以用我们之前说过的interface{}。

Chan创建了之后,我们想要从其中获取数据或者是把数据放入其中也非常简单,简单到都没有api,直接用形象的传输语句就可以了。

比如我们现在有一个chan是ch,我们想要放入数据,我们可以这样ch <- a。我们想要从ch当中获取数据,我们可以v := <- ch。

我们用箭头表示数据的流动,是不是很形象很直观呢?

阻塞

但是还没完,chan有一个很关键的点在于,chan的使用是阻塞的。也就是说下游从chan当中拿走一个数据我们才可以传入一个数据。否则的话,传输数据的代码就会一直等待chan清空。

同样,如果我们定义了一个从chan当中读取数据的语句,假如当前的chan是空的话,那么它也会一直阻塞等待,直到chan当中有数据了为止。

所以我们就知道了,chan的使用场景当中需要一个生产方,也需要一个消费方。我们来看一个golang官方的一个例子:

package mainimport "fmt"func sum(s []int, c chan int) { sum := 0 for _, v := range s {sum= v } c <- sum // 将和送入 c}func main() { s := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) x, y := <-c, <-c // 从 c 中接收 fmt.Println(x, y, x y)}

我们启动了两个goroutine去对数组进行求和并进行返回,goroutine生产的数据是没办法直接return的,所以只能通过chan的形式传输出来。chan传输出来需要下游消费,所以上面两个goroutine的数据会传输到x, y: <-c, <-c 这一句语句当中。

前面说过了,chan的传输是阻塞的,所以这一句语句会一直等待,直到上面两个goroutine都计算完成了为止。

如果你看的有些发蒙,觉得好似有些理解了又好似没有的话,那么很简单的一个办法是在理解的时候把这个使用场景做一个变幻。把chan的使用场景想象成我们之前介绍过的生产者消费者设计模式,chan在其中扮演的角色其实就是队列。

生产者往队列当中传输数据,消费者进行消费,唯一不同的是这个队列的容量是1,必须要生产和消费端都准备就绪了才会进行数据传输。

chan的缓冲

前文说了,chan的容量只有1,只有消费端和生产端都就绪的时候才可以传输数据。我们也可以给chan加上缓冲,如果消费端来不及把所有的数据都消费完,允许生产端先把数据暂时存在chan当中,先不发生阻塞,只有在chan满了之后才会阻塞。

用法也很简单,我们在通过make创建chan的时候多加上一个参数表示容量即可,和我们之前创建切片的道理很类似。

Ch := make(chan int, 100)

比如这样,我们就创建了一个缓冲区为100的信道。

但多说一句,其实这种情况不太常用,原因也很简单。因为上下游的消费情况是统一的,如果生产者生产的速度过快,而消费端跟不上的话,即使把它先暂存在缓冲区当中也没什么用,早晚还是会要阻塞的。

close

当我们对信道使用结束之后,可以通过close语句将它关闭。

Close这个操作只能在生产端进行,消费端如果close信道会引发一个panic。我们在从chan接收数据的时候,可以加上一个参数判断信道是否关闭。

v, ok := <- chif !ok { return}

这样我们就可以判断chan关闭的时间了。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

相关阅读

Python | 面试的常客,经典的生产消费者模式

本文始发于公众号:TechFlow

    推荐阅读
  • 钟灵毓秀在哪里(钟灵毓秀绍兴柯岩)

    柯岩风景区依托千年越文化,彰显绍兴独具特色的石文化、水文化、桥文化、酒文化、戏曲文化、名士文化、民俗文化等人文资源,乃绍兴久负盛名的传统旅游胜地。柯岩大佛为弥勒佛,佛高20.8米。柯岩风景优美,石景独特,可以乘坐独具特色乌篷船,而且游完整个景区也不累,强力推荐一下。

  • 王者荣耀阿古朵反野削弱(阿古朵胜率第一)

    放生掉野怪后,阿古朵不但会获得原有的收益,后续放技能还会召唤出不同的小动物来帮忙。阿古朵的一技能是团战的利器,也正是因为有她,有阿古朵的一方在前期才会更占优势。这就要说到阿古朵最核心的机制了。让阿古朵成为最强打野的因素我认为让阿古朵变成最强打野一共有三个原因。

  • 爬楼梯可以提臀吗(爬楼梯会瘦腿提臀吗)

    怎样爬楼梯提臀为了避免在运动的过程中出现脚踝扭伤或膝部疼痛的现象,在爬楼梯之前最好最一下热身运动,可以转一下脚腕,活动一下膝关节,做一些跳跃和伸展的动作。爬楼梯提臀的注意事项1.女性在爬楼梯提臀的过程中,最好不要穿高跟鞋和,以免增加关节的负荷,柔软的厚底鞋或者是运动鞋是最合适的。

  • 颈椎病的症状(颈椎病的症状表现有哪些)

    颈椎病是指颈椎间盘退行性变、颈椎肥厚增生以及颈部损伤等引起颈椎骨质增生,或椎间盘脱出、韧带增厚,刺激或压迫颈脊髓、颈部神经、血管而产生一系列症状的临床综合征。

  • 本科去美国留学申请流程(想去美国本科留学)

    留学美国本科方式一:不参加高考,直接申请美国本科。留学美国本科方式二:先入读社区大学再转入四年制本科大学。美国的社区大学在美国教育体系中也有着非常重要的地位。选择这种方式留学美国本科的都是家庭经济条件比较好的,老早就做好送孩子去美国上学的家庭。不过采取这种方式去美高读书的好处是可以提前适应美国的课程体系,并且跟别的留学生相比更有竞争力。

  • 九江电动车去哪里上牌? 九江电动车上牌截止时间

    九江市公安局交管第一大队地址:九江市浔阳区十里大道109号第三中学对面原市工商局咨询电话:0792—8220276九江市公安局交管二大队地址:濂溪区十里大道766号九江市公安局交管第三大队地址:濂溪区庐山大道与怡康路交叉口西150米九江各县区公安局交管大队市、县(市、区)人民政府(管委会),庐山管理局公安机关交通管理部门负责本行政区域内的临时通行标志电动车城市道路通行管理工作。

  • 扬州六税两费减免政策内容 六税两费减免时间

    所称从业人数和资产总额指标,应按企业全年的季度平均值确定。小型微利企业的判定以企业所得税年度汇算清缴结果为准。

  • 贾静雯演的电视剧(在角色中成长的贾静雯)

    2006年,贾静雯与黄磊搭档主演了都市言情剧《悲伤时唱首歌》,并在剧中饰演了因遭受初恋情人遗弃而精神失常的女主角关良沛。2015年,贾静雯与邱心志、王艺哲等人合作主演了现代情感剧《隐形的翅膀》,并在剧中饰演了人生充满苦难的敏娜。2019年,贾静雯凭借《我们与恶的距离》获得第54届电视金钟奖戏剧节目女主角奖,以及第26届华鼎奖中国百强电视剧最佳女

  • 电视剧家产多少集(家产集数)

    下面内容希望能帮助到你,我们来一起看看吧!电视剧家产多少集《家产》是由金英马影视集团与金画面影视传媒联合出品的36集家庭伦理电视剧。由张汉杰、王楚联和执导,贾乃亮、邓家佳、林家川、刘莉莉、李光复、孙松、赵君、范雷联袂主演主演。该剧讲述的是高家四个儿女因为老爷子留下的家产上演了一出遗产争夺战。

  • 汽车保险都该买哪些(不可以避免的问题)

    在己方无责但无法找到肇事方的情况下,和保险公司签订责任转移赔偿协议后,己方要承担30%的责任。这属于人身意外险的一种补充,并且和其他人身意外险不冲突,共同赔偿。任何碰撞造成的损失则属于车损险范畴。