题目:
以下代码有什么问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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 语句未必都能执行到。
这是使用 WaitGroup 经常犯下的错误!多次运行就会发现输出都会不同甚至又出现报错的问题。 这是因为 go 执行太快了,导致 wg.Add(1) 还没有执行 main 函数就执行完毕了。wg.Add 的位置放错了。
改为下面代码即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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() }
|