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

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

    推荐阅读
  • 档案数字化过程中的注意事项(一文看懂纸质档案数字化基本流程)

    通过编制程序或借助相应软件,可实现目录数据对相关联的数字图像的自动搜索、加入对应的电子地址信息等,实现批量、快速挂接。(八)数据验收一个全宗的档案,数字化转换质量抽检的合格率达到95%以上时,给予以验收“通过”。验收"通过"的结论,必须经分管领导审核、签字后方有效。

  • 去大黄花鱼鳞妙招(黄花鱼鳞窍门)

    以下内容大家不妨参考一二希望能帮到您!去大黄花鱼鳞妙招将鱼放到水盆里面浸泡,在水盆里面加入一些醋,泡制十分钟左右,鱼鳞就会容易去掉。用热水烫,将烧开的的热水倒在鱼身上,然后再将鱼放到冷水中,这样一热一冷会让鱼鳞松动,容易取出。可以使用钢刷,钢刷比较硬,用钢刷刷鱼的背部就会把鱼鳞刷下来。只要家刀够快就可以用刀很轻松的将鱼鳞去除。

  • 玉屏风粥做法(玉屏风粥做法介绍)

    下面更多详细答案一起来看看吧!玉屏风粥做法食物原料:防风5克,白术10克,黄芪20克,粳米30克,白砂糖少许。制作方法:将上述3味中药先放砂锅内加水熬汤两次、去渣;两次药汤合并后放入粳米熬成粥,调入少许白砂糖即可。

  • 吊唁短信怎么写(如何写吊唁短信)

    得知姨妈去世,我们全家十分悲痛,我的心中更是难受不已。只因没能亲自参加老人家的葬礼,深为遗憾。老人家的养育之恩,坚强的性格、朴实的形象,是我们年轻人永远不能忘怀的。让我们永远记住她老人家,好好工作,做一个对社会有益的人,这也是姨妈一生为之奋斗的心愿。请把心放宽些,把姨妈最喜欢的欢欢培养成才,老人家定会含笑九泉的。随信寄上1000元钱,请在姨妈灵前代献花圈致哀。

  • 奥特曼中哪个人最强(奥特曼实力排名)

    奥特曼中哪个人最强奥特曼实力排名:麦克斯奥特曼、诺亚奥特曼、银河奥特曼、捷德奥特曼、奥特之王。另外一个是超巨大化,九百米身高,在设定上也有其他奥特曼能够巨大化。诺亚曾经可是公认的最强奥特曼,一些奥迷将其奉为奥特之神。奥特之王,光这称号就强,奥特曼的王者。凭借一己之力修复了被贝利亚炸毁的宇宙,实力超强。

  • 世界上最珍贵的山水(世界著名的三条江河集中发源于这里)

    答案揭晓土族民族彩蛋土族,主要聚居于青海、甘肃两省。居住地处美丽的青海湖东边、雄伟的祁连山南面,滔滔的湟水和大通河两岸的广大地区。妇女服饰中最有特色的是七彩花袖,花袖是由红、黄、绿、青、紫五色彩布拼制而成。婚礼是撒拉族人生礼仪中最为重要的一个礼仪活动。三江源地区是世界上高海拔生物多样性最集中的地区之一,也是世界上水资源最为丰富的地区之一,因此被誉为“中华水塔”。

  • 好的防冻液对动力有好处吗(防冻液当润滑液)

    汽车防冻液很像人体的血液,血液循环给身体输送能量。防冻液循环带走车内不必要得热量,但是你知道么,防冻液其实还有很多额外能力!防冻液中含有润滑成分,在保证润滑的基础上还可以防止塑料橡胶管件的溶解老化。

  • 生日的感悟唯美句子(生日的感悟唯美句子有哪些)

    我们一起去了解并探讨一下这个问题吧!生日的感悟唯美句子如果你因失去了太阳而流泪,那么你也将失去群星了。祝自己生日快乐驶入不惑,收获不多,以后如何,思绪很多。40岁了,没有学会珍惜,很多值得把握的东西都被很轻易的放弃了。现在想想,实在有些在可惜。虽然人这一生,不可能背负太多,金钱、权力我不去追求,但至少不能丢掉友谊。最后,祝我生日快乐,祝所有今天生日的人生日快乐,祝我所有朋友快乐!

  • 买宝马官方认证二手车有免息吗(二手车不要买宝马认证)

    车辆的手续也非常重要,能正常提档过户是检验手续合法的唯一标准。有“身份认证”的二手车自然不是那些“妖艳贱货”能相提并论的:上海德宝公司背靠宝马集团,不仅信誉好,还拥有一流的检测设备。单是这些数据只能算通过德宝公司的入选门槛,但最终入选还要通过严格的检测,检测标准可不是德宝随便制定,而是全球统一标准的110项检测。

  • ofo共享单车退押金在哪找(退押金限制消费)

    全面免押金之后,哈啰单车两个月内注册用户增长70%,日均订单量增长100%。2018年6月,在美团支持下的摩拜跟进哈啰,采取了免押金策略。初期ofo押金为99元,2017年6月后上涨至199元。扣除与芝麻信用合作期间为3000万用户免除的40亿押金,ofo的用户押金规模仍应有160亿元。尽管ofo表示押金随时可退,但用户频频遭遇退押金难只能说明彼时ofo挪用押金或已超百亿元。