我正在查看 Golang 文档中的典型数据竞争,我不太明白为什么这个程序会出现问题:
func main() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
fmt.Println(i) // Not the 'i' you are looking for.
wg.Done()
}()
}
wg.Wait()
}
它5, 5, 5, 5, 5
会在我期望它打印时打印0, 1, 2, 3, 4
(不一定按此顺序)。
在我看来,当 goroutine 在循环内创建时,值i
是已知的(例如,可以log.Println(i)
在循环开始时执行 a 并查看预期值)。所以我希望 goroutine 能够捕获i
它创建时的值并在以后使用它。
显然这不是正在发生的事情,但为什么呢?