go语言的select 与chan

chan是golang非常重要的一个概念,用于在不同的goroutine之间通信或共享数据,是go推荐的共享数据的方式。

chan有默认的deadlock检测机制,例如这段代码

http://play.golang.org/p/_0UWFWiGOr

运行的时候会提示: fatal error: all goroutines are asleep – deadlock!

chan可以与select相结合,当chan与select结合的时候,有一个很有意思的现象,就是chan会变成非阻塞的

更有趣的是time.Timer,chan与select相结合的例子,每次select的chan case发生时,都会重置timer。一个极端的例子,select中,只有timer和default时,这个程序将几秒钟把系统资源耗尽,不知道算不算bug,代码在这里:

http://play.golang.org/p/WYA-0HmUEH

还有,如果一个select中,有timer和default,那么timer永远都不会返回。

原因似乎是每次select结束,都会重置timer,不知道我的理解是否有偏差。

 

本文来自:铁哥的博客

感谢作者:铁哥

查看原文:go语言的select 与chan

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。