字面启动goroutine和loop控制流里启动goroutine的执行效果为什么不一样

具体的代码我放在了play.golang

代码1: http://play.golang.org/p/HcwPzI4S5J

代码2: http://play.golang.org/p/fvDjWlJiub

按理说,两者应该有一样的结果,但实际是代码一会正常执行,而代码二会死锁。

为什么会死锁呢?两片代码的区别仅仅在于如何启动goroutine的地方.

代码的意图:

把流入三个分支信道的数据复合流入到一个信道,然后从这个总输出信道取数据。


追加: 再观察下这段代码 http://play.golang.org/p/WcdR9Cm5JD

不同之处是用另一种方式来迭代.

报的错误不是deadlock而是runtime error了!

阅读 4.9k
2 个回答
新手上路,请多包涵

for i := range c能够不断读取channel里面的数据,直到该channel被显示关闭close(channel)。 通过语法v, ok := <- ch测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题