f1.go
package main
var A int = 3
var B int = A + 1
var C int = A
f2.go
package main
import "fmt"
var D = f()
func f() int {
A = 1
return 1
}
func main() {
fmt.Println(A, B, C)
}
执行
markjour@victus ~/test02
$ go version
go version go1.18.6 windows/amd64
markjour@victus ~/test02
$ go run f1.go f2.go
1 4 3
markjour@victus ~/test02
$ go run f2.go f1.go
1 2 3
分析
f1f2 的情况下:变量初始化的顺序应该为 A B C D,所以输出 1 4 3 是没有问题的。
f2f1 的情况下:变量初始化的顺序应该为 A D B C,所以按理应该输出 1 2 1,实际确实输出 1 2 3。
f1 中 A C 中只要一个的初始化改成这样就可以符合预期:
func initA() int {
return 3
}
func initC() int {
return A
}
这是 Go 的一个 BUG,即将在 Go 1.20 修复。
知道就行了。
参考资料与拓展阅读
- 知乎,陈煎鱼, Go1.20 将会修改全局变量的初始化顺序。梅开二度,继续打破 Go1 兼容性承诺!
- cmd/compile: global variable initialization done in unexpected order #51913
- The Go Programming Language Specification, Package initialization