作为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
不,正如你自己所说,它确实是 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 相同,结果相同
归档时间: |
|
查看次数: |
112 次 |
最近记录: |