このコードを見てください:
func main() {
var x int
go func() {
for {
x++
}
}()
time.Sleep(time.Second)
fmt.Println("x =", x)
}
最後にx
等しいのはなぜですか?0
Go のスケジューラーがtime.Sleep()
ゴルーチンを取得するために呼び出しを必要とすることは理解していますが、なぜそうしないのでしょうか?
ヒント: for ループ内にatime.Sleep()
または への呼び出しをruntime.Gosched()
しかし、なぜ?
更新:同じコードの次のバージョンを確認してください。
func main() {
var x int
go func() {
for i := 0; i < 10000; i++ {
x++
}
}()
time.Sleep(time.Second)
fmt.Println("x =", x)
}
奇妙なことに、ゴルーチン内のコードが実行され、x
0 ではなくなりました。コンパイラはここで最適化を行いますか?