go语言的select 与chan

铁哥 · · 8608 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8608 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传