6、WaitGroup

最后更新于:2022-04-02 08:15:36

[TOC] ## 六、WaitGroup ### (1) WaitGroup与goroutine的竞速问题 > 编译并运行如下代码会发生什么? > test18.go ```go package main import ( "sync" //"time" ) const N = 10 var wg = &sync.WaitGroup{} func main() { for i := 0; i < N; i++ { go func(i int) { wg.Add(1) println(i) defer wg.Done() }(i) } wg.Wait() } ``` **结果** ```bash 结果不唯一,代码存在风险, 所有go未必都能执行到 ``` 这是使用WaitGroup经常犯下的错误!请各位同学多次运行就会发现输出都会不同甚至又出现报错的问题。 这是因为`go`执行太快了,导致`wg.Add(1)`还没有执行main函数就执行完毕了。 改为如下试试 ```go package main import ( "sync" ) const N = 10 var wg = &sync.WaitGroup{} func main() { for i:= 0; i< N; i++ { wg.Add(1) go func(i int) { println(i) defer wg.Done() }(i) } wg.Wait() } ```
';