1 回答
TA贡献1829条经验 获得超6个赞
该程序在调用wg之间有一场竞赛。添加并调用 wg。等等。这些调用可以按任何顺序发生。在调用 之前,调用 时不等待任何 goroutines。wg.Waitwg.Waitwg.Add
通过在启动调用 的 goroutine 之前将调用移动到 进行修复。此更改可确保在调用 之前进行调用。wg.Addwg.Waitwg.Addwg.Wait
for i := 0; i < 5; i++ {
x := i
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("Value: ", x)
ch <- x
}()
}
go func() {
defer close(ch)
defer close(done)
wg.Wait()
done <- struct{}{}
}()
该类型具有在竞赛检测器下运行时检查此错误的代码(建模读取,建模写入)。WaitGroup
通过在关闭时中断主 goroutine 中的循环来简化代码。不需要该通道。chdone
ch := make(chan int)
wg := sync.WaitGroup{}
for i := 0; i < 5; i++ {
x := i
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("Value: ", x)
ch <- x
}()
}
go func() {
wg.Wait()
close(ch)
}()
for i := range ch {
fmt.Println("Value: ", i)
}
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
