go语言的select 与chan
铁哥 · · 9278 次点击 · · 开始浏览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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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,不知道我的理解是否有偏差。