3 回答

TA貢獻1828條經驗 獲得超6個贊
因為這:
for x:=range c {
println(x)
}
將循環直到通道c關閉,這在這里從未完成。
這是修復此問題的一種方法,即使用 WaitGroup:
package main
import "sync"
func main() {
var wg sync.WaitGroup
c := make(chan int, 10)
for i := 0; i < 5; i++ {
wg.Add(1)
go func(chanel chan int, i int) {
defer wg.Done()
println("i", i)
chanel <- 1
}(c, i)
}
go func() {
wg.Wait()
close(c)
}()
for x := range c {
println(x)
}
println("Done!")
}

TA貢獻1816條經驗 獲得超6個贊
您創建五個 goroutine,每個 goroutine 向通道發送一個整數值。一旦所有這五個值都被寫入,就沒有其他 goroutine 寫入通道了。
主 goroutine 從通道讀取這五個值。但是沒有任何 goroutine 可以寫入第六個值或關閉通道。因此,您在等待來自通道的數據時陷入僵局。
所有寫入完成后關閉通道。弄清楚如何使用這段代碼來做到這一點應該是一個有趣的練習。

TA貢獻1827條經驗 獲得超4個贊
需要關閉通道以指示任務已完成。
與a協調sync.WaitGroup:
c := make(chan int, 10)
var wg sync.WaitGroup // here
for i := 0; i < 5; i++ {
wg.Add(1) // here
go func(chanel chan int, i int) {
defer wg.Done()
println("i", i)
chanel <- 1
}(c, i)
}
go func() {
wg.Wait() // and here
close(c)
}()
for x := range c {
println(x)
}
println("Done!")
https://play.golang.org/p/VWcBC2YGLvM
- 3 回答
- 0 關注
- 183 瀏覽
添加回答
舉報