2 回答

TA貢獻1836條經驗 獲得超13個贊
查看這篇關于channel-axioms 的文章。看起來在關閉wdCh
和在closeCh
通道上發(fā)送 true之間存在競爭。
因此,結果取決于在pushWords
返回 和之間首先安排什么Accumulate
。
如果TestAccumulate
首先運行,則發(fā)送 true on closeCh
,然后在Accumulate
運行時它會選擇兩個通道中的任何一個,因為它們都可以運行,因為pushWords
closed wdCh
。
來自關閉通道的接收立即返回零值。
直到closedCh
發(fā)出信號,Accumulate
會在地圖中隨機放置一個或多個空“”字。
如果Accumulate
首先運行,那么它可能會在單詞映射中放入許多空字符串,因為它會循環(huán)直到TestAccumulate
運行并最終在 上發(fā)送信號closeCh
。
一個簡單的解決方法是移動
close(wdCh)
發(fā)送后true
上closeCh
。這種方式wdCh
不能返回零值,直到您在closeCh
. 此外,closeCh <- true
塊因為closeCh
沒有緩沖區(qū)大小,所以wdCh
在你保證Accumulate
永遠完成循環(huán)之前不會關閉。

TA貢獻1802條經驗 獲得超4個贊
我認為原因是當您關閉通道時,“選擇”雖然會收到信號。
因此,當您關閉“func pushWords”中的“wdCh”時,Accumulate 中的循環(huán)將從“<-wdCh”接收信號??赡苁悄銘撎砑右恍┐a來測試通道關閉后的動作!
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 關注
- 300 瀏覽
添加回答
舉報