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++
并不存在。
为什么?
答案 0 :(得分:3)
所有这些都在Go Memory Model中解释。
在此示例中,在递增i
和打印i
之间的关系之前没有发生过。因为在关系之前没有发生,主要的goroutine可能会或可能看不到i
的更改。
允许编译器优化i++
,因为无法保证会发现对i
的更改。