我看Golang文檔中的typical data races,我不明白爲什麼有這個程序有問題:爲什麼在這個程序中有競爭條件?
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)
並查看期望值)。所以我希望goroutine能夠在創建時獲得i
的值,並在以後使用它。
顯然這不是發生了什麼,但爲什麼?