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
(必ずしもこの順序であるとは限りません)。
私の見方では、ゴルーチンがループ内で作成されると、 の値i
がわかっています (たとえば、log.Println(i)
ループの先頭で a を実行して、期待値を確認できます)。したがって、ゴルーチンi
が作成時の値を取得し、後でそれを使用することを期待しています。
明らかにそれは何が起こっているのかではありませんが、なぜですか?