1 回答
TA贡献1821条经验 获得超4个赞
您可以等待组并在单独的 go 例程中关闭通道。如果通道关闭,您在通道上的范围将在收到最后一个发送的值后结束。
如果您只是等待,则不会从频道收到任何内容。由于通道是无缓冲的,performTestgoroutines 将无法发送。对于无缓冲通道,发送操作将阻塞,直到它被接收。因此,延迟wg.Done调用永远不会发生,您的程序就会陷入僵局。由于Done仅在执行永久阻塞发送后调用。
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 关注
- 90 浏览
添加回答
举报