2 回答
TA贡献1836条经验 获得超13个赞
查看这篇关于channel-axioms 的文章。看起来在关闭wdCh
和在closeCh
通道上发送 true之间存在竞争。
因此,结果取决于在pushWords
返回 和之间首先安排什么Accumulate
。
如果TestAccumulate
首先运行,则发送 true on closeCh
,然后在Accumulate
运行时它会选择两个通道中的任何一个,因为它们都可以运行,因为pushWords
closed wdCh
。
来自关闭通道的接收立即返回零值。
直到closedCh
发出信号,Accumulate
会在地图中随机放置一个或多个空“”字。
如果Accumulate
首先运行,那么它可能会在单词映射中放入许多空字符串,因为它会循环直到TestAccumulate
运行并最终在 上发送信号closeCh
。
一个简单的解决方法是移动
close(wdCh)
发送后true
上closeCh
。这种方式wdCh
不能返回零值,直到您在closeCh
. 此外,closeCh <- true
块因为closeCh
没有缓冲区大小,所以wdCh
在你保证Accumulate
永远完成循环之前不会关闭。
TA贡献1802条经验 获得超4个赞
我认为原因是当您关闭通道时,“选择”虽然会收到信号。
因此,当您关闭“func pushWords”中的“wdCh”时,Accumulate 中的循环将从“<-wdCh”接收信号。可能是你应该添加一些代码来测试通道关闭后的动作!
for {
select {
case word, ok := <-wdCh:
if !ok {
fmt.Println("channel wdCh is closed!")
continue
}
fmt.Printf("word = %s\n", word)
words[word]++
case <-closeCh:
return
}
}
- 2 回答
- 0 关注
- 260 浏览
添加回答
举报