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,不知道我的理解是否有偏差。
有疑问加站长微信联系(非本文作者)