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

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

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

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

    推荐阅读
  • 6月份suv销量排行榜全榜单(6月470款SUV销量排行榜)

    近日,6月份SUV销量排行榜完整版新鲜出炉,共有470款SUV参与销量排名,整体看排行榜,万辆俱乐部会员共有23款SUV,自主品牌9款,合资品牌14款,明显合资品牌还是SUV细分市场的主力军。具体车型方面,特斯拉ModelY以51745辆夺冠,本田CRV以21829辆排第二名,宋PLUSPHEV以20569辆屈居第三名,这就是6月份SUV销量排行榜前三名,而我们熟知的销量冠军哈弗H6,跌落为第五名,并且已经连续几个月失去了冠军宝座。

  • 月饼到底能不能吃胖(无糖月饼随便吃是误区)

    医生指出,月饼虽好吃,但不宜贪多。生活中经常可以看见“无糖月饼”、低糖月饼,但这些月饼也不宜多吃,特别是糖尿病人、患有消化系统疾病的患者和儿童不宜多吃。湖南中医药大学第一附属医院脾胃病科医生徐寅介绍,为了满足人们需求,月饼在不断创新。湖南中医药大学第一附属医院中医专家刘建和建议,月饼有高糖、高脂的特点,过量进食会增加血液黏稠度,不建议心脑血管疾病患者过度食用。

  • 一年级的孩子觉得自己什么都做不好怎么办(如何正确的鼓励孩子)

    尤其当孩子遭遇到失败时。重点是让孩子重拾对自己的自信。孩子的行为,总是会有值得肯定的。也会有需要父母指出错误的地方。这个过程,是对孩子的激励。但是过分的打压,会让孩子失去自信,而变得自卑。怕孩子骄傲,可以在适当的时候,提醒一下。任何时候,没有希望都是可怕的事情。让孩子抱有希望。隔一段时间,就可以跟孩子组成一个家庭时间。聊一聊这一段时间,各自的烦恼,见闻之类。还可以促进父母跟孩子之间的了解。

  • 猪肉菠菜炒粉条的做法(如何做猪肉菠菜炒粉条)

    猪肉菠菜炒粉条的做法用料:菠菜一斤、粉条500克、五花肉、葱姜、十三香、厨邦酱油、老抽、食用碱、食用盐。发现粉条晶莹剔透之后,关火。捞出冲凉水备用。将菠菜根径分别焯水放置备用。锅内倒入油爆香葱和姜,放入五花肉。将粉条,和各种调料均匀地搅拌好放入凉水量水开了后放入菠菜的根炖一会儿。将菠菜叶子放入锅内放少许的食用碱保证菠菜的鲜绿。轻微搅拌后盖上锅盖。等一会到汤水粘稠大火收汁,撒少于鸡精即可。

  • 小米苦荞粥的家常做法(教你小米苦荞粥的家常做法)

    以下内容希望对你有帮助!小米苦荞粥的家常做法材料:苦荞小米适量。准备好苦荞小米,准备待用。将淘好的小米放进锅里。打开煤气炉,准备熬制,大约40分钟左右即可成功。将苦荞小米粥盛在碗里,然后可以喝了。

  • 15万以内杜卡迪(杜卡迪发布全新)

    从2003年起杜卡迪征战MotoGP,再创辉煌,截止2020年底杜卡迪斩获51次夺冠,1个年度总冠军,两个制造商冠军荣誉。此次博览会现场,杜卡迪携Panigale、XDiavel、Streetfighter、Scrambler、Monster等多款车型亮相,并正式发布全新杜卡迪SuperSport950。全新设计使下部整流罩延伸至消音器,将发动机隐藏,视觉上更接近赛车。另外自2022年1月1日起,杜卡迪在中国地区所售的全系车型,零售价格将会平均上调约3.5%。

  • 徐州矿务集团第二医院核酸检测出结果时间

    徐州矿务集团第二医院核酸检测出结果时间地点:北院核酸采样室采样及报告时间:周一至周六采样时间取报告时间08:00-10:0014:0010:00-12:0014:00—14:3018:0014:30-17:0022:30周日采样时间取报告时间08:00-10:0014:0010:00-12:0014:00-16:0019:30

  • 学编程对孩子未来有什么帮助(编程教育对孩子有什么用处)

    最近,“编程教育”成了艾叔朋友圈出现的高频词。在看到这位高中同学回复自己也不太清楚后,艾叔有必要给大家讲讲编程教育对孩子有哪些益处,让家长们尽早了解编程教育。目前,全球已有20多个国家将编程纳入中小学基础课,少儿编程教育正成为教育的新趋势,成为国家人工智能战略推进的关键。家长一定要早日洞悉编程教育的重要性,让孩子尽早学习编程,掌握未来社会所需的基本技能。

  • 狐狸毛怎么去味(让人恶心的杂毛)

    就在这时,林弥踢开门进来,拉了芸茜就走。芸茜赶紧过来帮忙,两人齐心协力,终于将短棍掰动,中间那两排书架自动向两边挪动,露出一个仅容两人通过的口子。林弥将手机交给芸茜,告诉她尽头是后门不远处的一个小花园,花园直通外面的大马路。随着林弥一声低喝,芸茜看到一个小门,不由的加快了步伐。芸茜还未反应过来,就听他低骂了一句,好似被身边的人出卖了。芸茜想往回跑,但被林弥阻止。