如果直接在main方法中读取会出现error,如果使用go receive方式程序正常

weixin_38049686 2019-09-20 10:35:30
...全文
63 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38091120 2019-09-20
  • 打赏
  • 举报
回复
o,还得注意,关闭channel 的操作不能和读取channel 的操作在一个协程里
weixin_38095707 2019-09-20
  • 打赏
  • 举报
回复
这个代码一共创建了11个goroutine, send 10个, main 1个, 当send 10 个都运行完后, 唯一一个main goroutine就阻塞在接受通道的for循环那等待数据进来, 此时没有任何goroutine可以运行, 所以发生死锁
weixin_38111013 2019-09-20
  • 打赏
  • 举报
回复
多谢回答,现在明白些了, 另外我问一下, 1.range方式读取chan , 如果不手动close掉chan ,对于range来说,他会一直读取chan是吗? 我尝试过读取 ` ch := make(chan int) for n:= range ch{ fmt.Println(n) } ` 这样是会报错的。 2. 我能简单的把go协程理解成线程安全的队列吗?
weixin_38112805 2019-09-20
  • 打赏
  • 举报
回复
这两个不是一个问题,第一:for range 去读取channel 是一直去读取的,直到你的channel 关闭。这是正常情况。第二: ` ch := make(chan int) for n:= range ch{ fmt.Println(n) } `这种,创建并没有写入channel ,所以读取的时候,会直接报错deadlock。
weixin_38123446 2019-09-20
  • 打赏
  • 举报
回复
明白了,多谢回答
weixin_38128682 2019-09-20
  • 打赏
  • 举报
回复
多谢回答,你这思路真好。
weixin_38141078 2019-09-20
  • 打赏
  • 举报
回复
- 多谢回答,现在已经搞懂了,最开始没有明白 for range 跟channel组合玩法。
weixin_38068363 2019-09-20
  • 打赏
  • 举报
回复
因为如果放在main中,会从channel中读数据,没有读到就会死锁。
weixin_38074625 2019-09-20
  • 打赏
  • 举报
回复
@waini1110</a> #### 首先感谢回答,另外: ##### 对于读取来说应该是发现channel有数据就拿 ,没有数据就阻塞 ##### 对于发送来说向channel中存,存完阻塞,等待channel数据被取走后再存 ##### 现在我在main中不断读取channel, 假设channel不存在数据,他应该只是阻塞状态,为什么会提示 all goroutines are asleep - deadlock
weixin_38075910 2019-09-20
  • 打赏
  • 举报
回复
因为你只写了五个,五个写完之后,只有读的操作,没有写的操作,才会死锁。你写完之后关掉channel,就不会有这个问题
weixin_38080819 2019-09-20
  • 打赏
  • 举报
回复
抱歉,是十个

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧