我正在嘗試練習 goroutine 和通道,但我遇到了調(diào)用 gorouting 和傳遞通道的問題。Goroutine 將數(shù)據(jù)推送到通道中,然后主線程將打印元素。我已經(jīng)使用 for 循環(huán)來打印內(nèi)容但是得到了。fatal error: all goroutines are asleep - deadlock!21goroutine 1 [chan receive]:main.main()package mainimport "fmt"func smallThread(a int, c chan int) { c <- a}func main() { c := make(chan int) go smallThread(1, c) go smallThread(2, c) for { fmt.Println(<-c) }}編輯:使用等待組:func smallThread(a int, c chan int, w *sync.WaitGroup) { c <- a w.Done()}func main() { c := make(chan int) var w sync.WaitGroup w.Add(2) go smallThread(1, c, &w) go smallThread(2, c, &w) //w.Wait() for i := range c { fmt.Println(i) } w.Wait()}EDIT2:工作代碼func smallThread(a int, c chan int, w *sync.WaitGroup) { //defer w.Done() c <- a w.Done()}func main() { c := make(chan int) var w sync.WaitGroup w.Add(1) go smallThread(1, c, &w) w.Add(1) go smallThread(2, c, &w) go func(c chan int) { for i := range c { fmt.Println(i) } }(c) w.Wait()}
2 回答

慕萊塢森
TA貢獻1810條經(jīng)驗 獲得超4個贊
當 goroutine 完成后,關(guān)閉通道以指示不再添加任何值。當接收到所有值后,for 循環(huán)將中斷。
c := make(chan int)
var w sync.WaitGroup
w.Add(2)
go smallThread(1, c, &w)
go smallThread(2, c, &w)
go func() {
w.Wait()
close(c)
}()
for i := range c {
fmt.Println(i)
}

DIEA
TA貢獻1820條經(jīng)驗 獲得超3個贊
不確定你的問題是什么,但我會告訴你會發(fā)生什么。你的兩側(cè) goroutine 將它們的數(shù)字推送到通道并退出。然后主 goroutine(此時只剩下唯一的一個)將永遠阻塞,等待另一個元素從通道中出來。
- 2 回答
- 0 關(guān)注
- 186 瀏覽
添加回答
舉報
0/150
提交
取消