channel是什么意思(简介channel常见用法)

访客4年前关于黑客接单1054

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

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

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

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

  Ch := make(chan int, 100)

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

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

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

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

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

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

  本文地址:

相关文章

英雄联盟手游剑圣好用吗 LOL手游剑圣玩法攻略

英雄联盟手游剑圣好用吗 LOL手游剑圣玩法攻略

对于英雄联盟玩家来说,剑圣是一个人气非常高的英雄。历经了无数个版本都是每个撸友的最爱之一,只因为剑圣成长起来在后期就是一条疯狗,拿五杀非常容易。英雄联盟手游剑圣厉害吗?这份LOL手游剑圣攻略快拿好!...

玩快手的人靠什么挣钱(快手评论赚钱2元一条)

玩快手的人靠什么挣钱(快手评论赚钱2元一条)

先跟大家闲聊几句,都说互联网时代,短视频是风口,可你们有没有想过: 那么多人做短视频,为什么赚到钱的人还不到1%? 回答这个问题之前,我想给你们分享几组真金白银的数字。 代古拉K,抖音头部舞蹈网红,俘...

芭蕉和香蕉的区别,看完秒懂了

芭蕉和香蕉的区别,看完秒懂了

香蕉大家都吃过,芭蕉就算没吃过总听说过,许多朋友对于它们的区别感兴趣,先说说我的第一感受,一是价格,芭蕉比香蕉要贵一倍,二是味道,香蕉更好吃,所以如果不是为了尝鲜,我肯定是选择买香蕉的,下面就来详细说...

请问微信盗号有什么方法?黑客盗号需要什么软件

本文由印和康海外医疗发布, 吉非替尼(易瑞沙)在治疗肺癌上表现出的效果颇佳,也因此很受患者青睐只是国外进口的这种药价格实在太贵,一盒就要好几万,国内的版本也不便宜每盒上万的售价让患者可望不可及,而...

如何偷偷查看别人已经删除的微信2021聊天记录

张蕾老公是谁 张蕾与对方有着怎么样的故事 张蕾老公是谁呢?张蕾是央视知名的主持人。张蕾2006年就进入到了央视,现今已经有14个年头了,关于她的感情生活,大家都非常的瞩目,都想要知道张蕾的老公是谁,2...

24小时在线接单的黑客追款(黑客24小时接单平台)

24小时在线接单的黑客追款(黑客24小时接单平台)

本文目录一览: 1、我被骗了诈骗了,网上找一个自称黑客的人说可以用DDOS帮我追回来,是不是骗人? 2、大学生“刷单兼职”被骗后求助“黑客”又被骗近万元是怎么回事? 3、红客追款让我玩另一个平...