1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
有幾個(gè)問(wèn)題。
第一個(gè)是程序在將它們作為參數(shù)傳遞時(shí)復(fù)制等待組值。復(fù)制時(shí)等待組不能正常工作。而是將指針傳遞給等待組。
第二個(gè)問(wèn)題是 main 在從通道接收值之前等待所有 goroutines 完成。因?yàn)橥ǖ赖木彌_區(qū)不夠大,無(wú)法容納所有發(fā)送的值,所以程序會(huì)死鎖。
第三個(gè)問(wèn)題是通道上方的主要范圍,但沒(méi)有任何東西關(guān)閉通道。Main 不會(huì)因此退出。
要解決第二個(gè)和第三個(gè)問(wèn)題,請(qǐng)啟動(dòng)另一個(gè) goroutine 等待doSomthings 并在完成后關(guān)閉通道。
嘗試這個(gè):
func doSomething(ch chan string, wg *sync.WaitGroup) {
defer wg.Done()
ch <- fmt.Sprintf("doSomething: %d", i)
i++
if i == 10 {
return
}
wg.Add(1)
go doSomething(ch, wg)
}
func main() {
ch := make(chan string)
var wg sync.WaitGroup
wg.Add(1)
go doSomething(ch, &wg)
go func() {
wg.Wait()
close(ch)
}()
for s := range ch {
fmt.Println(s)
}
}
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報(bào)