1 回答

TA貢獻1821條經(jīng)驗 獲得超5個贊
您可以等待組并在單獨的 go 例程中關(guān)閉通道。如果通道關(guān)閉,您在通道上的范圍將在收到最后一個發(fā)送的值后結(jié)束。
如果您只是等待,則不會從頻道收到任何內(nèi)容。由于通道是無緩沖的,performTestgoroutines 將無法發(fā)送。對于無緩沖通道,發(fā)送操作將阻塞,直到它被接收。因此,延遲wg.Done調(diào)用永遠不會發(fā)生,您的程序就會陷入僵局。由于Done僅在執(zhí)行永久阻塞發(fā)送后調(diào)用。
func main() {
channel := make(chan string)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go performTest(channel, &wg, i)
}
// this is the trick
go func() {
wg.Wait()
close(channel)
}()
for line := range channel {
fmt.Print(line)
}
}
func performTest(channel chan string, wg *sync.WaitGroup, i int) {
defer wg.Done()
// perform some work here
result := fmt.Sprintf("Pretend result %d\n", i)
channel <- result
}
https://play.golang.com/p/5pACJzwL4Hi
- 1 回答
- 0 關(guān)注
- 109 瀏覽
添加回答
舉報