go语言chan go语言常用标准库( 二 )


通过如下源码,你会更加清晰:
上面,从 chan 获取数据:
Go 语言核心思想:“Do not communicate by sharing memory; instead, share memory by communicating.” 你可以看看这本书名叫:Effective Go
如果接收者,接收一个空对象,也会发生什么情况?
代码示例:
也会报错如下:
上面,从 chan 取出数据,可是没有数据了 。此时,它会把 接收者 G2 阻塞掉,也是和G1发送者一样 , 也会执行 gopark 将状态改为 waiting,不一样的点就是 。
正常情况下,接收者G2作为取出数据是去 buf 读取数据的,但现在,buf 为空了,此时 , 接收者G2会将sudog导出来,因为现在G2已经被阻塞了嘛 , 会把G2给G,然后将t := -ch中变量t是在栈上的地址,放进去elem , 也就是说,只存它的地址指针在sudog里面 。
最后,ch - 200当G1往 chan 添加200这个数据,正常情况是将数据添加到buf里面,然后唤醒 G2 是吧,而现在是将 G1 的添加200数据直接干到刚才G2阻塞的t这里变量里面 。
你会认为,这样真的可以吗?想一想 , G2 本来就是已经阻塞了,然后我们直接这么干肯定没有什么毛?。倚侍岣吡?nbsp;, 不需要再次放入buf再取出,这个过程也是需要时间 。不然,不得往chan添加数据需要加锁、拷贝、解锁一序列操作,那肯定就慢了 , 我想Go语言是为了高效及内存使用率的考虑这样设计的 。(注意,一般都是在runtime里面完成,不然会出现象安全问题 。)
总结:
chan 类型的特点:chan 如果为空,receiver 接收数据的时候就会阻塞等待,直到 chan 被关闭或者有新的数据到来 。有这种个机制,就可以实现 wait/notify 的设计模式 。
相关面试题:
【go语言chan go语言常用标准库】go语言chan的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言常用标准库、go语言chan的信息别忘了在本站进行查找喔 。

推荐阅读