Golang 的通道入门(二)
目录
前言
正文
结尾
前言
前面讲了 Golang 语言中通道的概念,大家对通道应该有了基本的认识,至少应该知道通道是用来传输数据的。
正文
通道既然是用来传输数据的,那么这些数据一定有自己的类型,是的,没错。同样管道也有自己的类型,只是在数据类型的前面多了一个 chan 标识,比如 chan int,chan string 等。
通道既然是用来传输数据的,那么通道会不会有方向的区别呢?哈哈,是的。通道确实是有方向的,只不过,我们一般都是常见双向通道。注意,这里说的方向是数据的写入和读取。
这时,可能有人会问:是不是有些通道,只能来读数据?有些通道,只能来写数据?答案是 yes 。
那么如何声明和定义只读通道和只写通道呢?
接下来,看一段代码:
好的,明白来了吧。
那么通道还有别的类型吗?
有的,通道还有一种类型————缓冲通道。
一般创建的通道,其实也是有缓冲区的,只是缓冲区大小为 0。嘿嘿,就是没有嘛!
缓冲通道怎么声明和定义呢?我们再来看一段代码:
那么缓冲通道有什么特殊的作用呢?一般的非缓冲通道,每次读写都是阻塞的,很容易造效率问题,而缓冲通道就可以在一定程度上避免这个问题。
下面我们通过一个例子,来看看缓冲通道是怎么工作的吧。
实例代码:
代码执行过程:
子协程写入数据: 0
子协程写入数据: 1
子协程写入数据: 2
子协程写入数据: 3
子协程写入数据: 4
子协程写入数据: 5
主协程读取到的数据为: 0
主协程读取到的数据为: 1
主协程读取到的数据为: 2
主协程读取到的数据为: 3
主协程读取到的数据为: 4
主协程读取到的数据为: 5
主协程读取到的数据为: 6
子协程写入数据: 6
子协程写入数据: 7
子协程写入数据: 8
子协程写入数据: 9
子协程写入数据: 10
主协程读取到的数据为: 7
主协程读取到的数据为: 8
主协程读取到的数据为: 9
主协程读取到的数据为: 10
读取结束 false
主协程结束
我们可以看到,缓冲通道能够连续写入数据,即使没有被读取,也不会被阻塞。这样就能够避免像非缓冲通道那样一写一读的死板工作方式,当然这也需要看具体的使用场景,不能一概而论。
结尾
好了,今天关于通道的入门知识就讲这些,主要理解通道是有“方向”概念的,另外就是通道可以有缓冲区。
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄
版权声明: 本文为 InfoQ 作者【liuzhen007】的原创文章。
原文链接:【http://xie.infoq.cn/article/db48f7d6d7c823a16875510d9】。文章转载请联系作者。
评论