我正在嘗試編寫一個程序:package mainimport ( "fmt" "sync")func main() { n := 4 resChan := make(chan []int, n) res := []int{} var wg sync.WaitGroup for i := 0; i < n; i++ { wg.Add(1) go func(i int) { defer wg.Done() resChan <- append(res, i) }(i) } wg.Wait() close(resChan) // code will deadlock without this for subRes := range resChan { res = append(res, subRes...) } fmt.Printf("%v", res)}我認為我有一個緩沖通道,因此對通道的寫入不會阻塞。但是,我得到了:fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main() /tmp/sandbox562058728/prog.go:23 +0x14c有人可以解釋為什么代碼會這樣嗎?
2 回答

牛魔王的故事
TA貢獻1830條經驗 獲得超3個贊
如果通道沒有關閉,循環將永遠不知道何時停止迭代過程。
range-loop 無法從通道中讀取,因為它在寫入過程中被鎖定。另一方面,沒有更多數據要通過通道發送。因此,通道在寫入過程中被鎖定,并且永遠不會被解鎖。然后它會導致死鎖。
Golang Tour頁面上有寫的注釋說:
注意:只有發送方應該關閉通道,接收方不能。在關閉的通道上發送會引起恐慌。
另一個注意事項:頻道不像文件;您通常不需要關閉它們。僅當必須告訴接收器沒有更多值到來時才需要關閉,例如終止范圍循環。
- 2 回答
- 0 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消