我正在查看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并查看预期值)。所以我希望 goroutinei在它被创建时捕获它的值并在以后使用它。
显然这不是正在发生的事情,但为什么呢?
烙印99
慕莱坞森
相关分类