变量初始化有错误吗

ter*_*g77 5 initialization go

作为golang规范,我尝试编写测试代码。正如规范所说,初始化顺序是d,b,c,a,我认为b应该是4,c应该是5,但是我得到b == 5和c == 4出问题了吗?还是我误解了规格?

我尝试了以下版本

go version go1.12.4 linux/amd64
Run Code Online (Sandbox Code Playgroud)
go version go1.12.4 linux/amd64
Run Code Online (Sandbox Code Playgroud)

结果是

result:
a 9
b 5
c 4
d 5
Run Code Online (Sandbox Code Playgroud)

期望b = 4,c = 5

Vor*_*ung 0

不,正如你自己所说,它确实是 d,c,b,a

所以 d 是 3

然后 c 调用 f() 并且 d 是 4,因此 c 是 4

接下来 b 调用 f() 并且 d 是 5,因此 b 是 5

最后,a 是 c+b 或 9

由于 f() 的副作用,d 最终变为 5

这是相关部分的编译器输出

正如你所看到的,它先设置 c( c(SB)),然后设置 b,然后设置 a

  0x004b 00075 (b2.go:6)  CALL  "".f(SB)
  0x0050 00080 (b2.go:6)  MOVQ  (SP), AX
  0x0054 00084 (b2.go:6)  MOVQ  AX, "".c(SB)
  0x005b 00091 (b2.go:5)  CALL  "".f(SB)
  0x0060 00096 (b2.go:5)  MOVQ  (SP), AX
  0x0064 00100 (b2.go:5)  MOVQ  AX, "".b(SB)
  0x006b 00107 (b2.go:4)  MOVQ  "".c(SB), CX
  0x0072 00114 (b2.go:4)  ADDQ  CX, AX
  0x0075 00117 (b2.go:4)  MOVQ  AX, "".a(SB)
Run Code Online (Sandbox Code Playgroud)

(为了生成此输出,我使用了go tool compile -S -N abcd.go > abcd.s 实际的代码行编号来自稍微简化的版本,删除了 fmt import 和 print 语句)

这是 go 版本 go1.11.4 linux/amd64

尝试与 go 版本 go1.12.4 linux/amd64 相同,结果相同

  • [文档](https://golang.org/ref/spec#Package_initialization) 指出 *“初始化顺序是 d、b、c、a。”* 所以 d、c、b、a 似乎不正确,或者文档是。 (2认同)