以下代码有什么问题?
package main
import (
"sync"
)
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()
}
答:输出结果不唯一,代码存在风险, 所有 go 语句未必都能执行到。 解析:
var wg = &sync.WaitGroup{}
wg.Add(1)
wg.Done()
wg.Wait()
该用法类似一个栈,wg.Wait()判断wg中是否还有记录有的话堵塞直到栈为0才开始活跃。 这里的写法存在问题。wg.Add(1)被放到了协程中,导致存在未运行wg.Add(1),wg.Wait()就已经判断结束了。