博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于channel的一些坑
阅读量:7052 次
发布时间:2019-06-28

本文共 735 字,大约阅读时间需要 2 分钟。

channel可以分为无缓冲和带缓冲的通道

无缓冲的,必须要一个协程发送,一个协程接收

package mainfunc main() {	var ch = make(chan int)	ch <- 1	<- ch}

在主协程main,执行到 ch <- 1,即发送完消息就阻塞了。

下一句 <- ch 永远无法执行,因为所有goroutines都睡着了(即没有协程接收) - 死锁!!!

 

假如是带缓冲的,如下

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	<- ch}  

则不会报错,因为main goroutine并没有被阻塞,带缓冲1

 

如果连续发两个,则会报错,如下:

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	ch <- 1	<- ch}

 

但如果你及时接收了,则又不会报错,如下:

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	<- ch	ch <- 1	<- ch}

 

又或者在main goroutine里面再起一个goroutine,如下:

package mainfunc say(ch chan int) {	ch <- 1}func main() {	ch := make(chan int)	go say(ch)    // 新起协程,main goroutine并没有被阻塞	<- ch}

  

 

  

 

转载于:https://www.cnblogs.com/huangliang-hb/p/9759592.html

你可能感兴趣的文章
Windows 10将很快允许用户在未安装应用之前首先进行体验
查看>>
巧测字段最大长度
查看>>
TuShare(2):使用TuShare,抓取股票数据并存储到数据库
查看>>
还在跑分?什么样的固态硬盘才是好产品
查看>>
AI进入安防 安防的未来是怎样?
查看>>
《敏捷可执行需求说明 Scrum提炼及实现技术》—— 2.3 要求所有干系人参与
查看>>
Mozilla将从3月31日起实行插件“点击运行”机制
查看>>
《可穿戴创意设计:技术与时尚的融合》一一1.3 可穿戴设备和艺术
查看>>
JavaScript 实现的人脸检测方法
查看>>
Qubes OS 创始人认为英特尔 x86 是有害的
查看>>
《ANSYS Workbench有限元分析实例详解(静力学)》——2.3 工程流程图
查看>>
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——1.7 习题...
查看>>
《音乐达人秀:Adobe Audition CC实战222例》——1.2 从双卡录音机到多轨录音软件...
查看>>
年度回顾 看看 2016 年编程语言发展趋势
查看>>
vue axios+springboot 文件下载
查看>>
JS的继承方式
查看>>
掘金广告产品介绍
查看>>
九宫格
查看>>
手把手教你写一个 VSCode 插件
查看>>
cookie和session
查看>>