为什么这段代码是未定义的行为?

时间:2017-11-12 05:08:41

标签: go undefined-behavior

package main

import "time"
import "fmt"

var i int = 0

func loopInc() {
    for {
        i++
    }
}

func main() {
    go loopInc()
    <-time.After(1 * time.Millisecond)
    fmt.Println(i)
}

此代码将始终打印0。

我转储了可执行文件,发现go loopInc函数被编译为do-nothing循环。 i++并不存在。

为什么?

1 个答案:

答案 0 :(得分:3)

所有这些都在Go Memory Model中解释。

在此示例中,在递增i和打印i之间的关系之前没有发生过。因为在关系之前没有发生,主要的goroutine可能会或可能看不到i的更改。

允许编译器优化i++,因为无法保证会发现对i的更改。