as the spec of golang, I try to write test code. as the spec says, the init order is d,b,c,a, I think the b should be 4 and c should be 5, but I got b == 5 and c == 4 is there something wrong? or I misunderstand the spec?
I tried in go version as below
go version go1.12.4 linux/amd64
package main
import "fmt"
var (
a = c + b
b = f()
c = f()
d = 3
)
func f() int {
d++
return d
}
func main() {
fmt.Println("a", a)
fmt.Println("b", b)
fmt.Println("c", c)
fmt.Println("d", d)
}
the result is
result:
a 9
b 5
c 4
d 5
expect b = 4, c = 5
no, as you said yourself it does d,c,b,a
so d is 3
then c calls f() and d is 4, therefore c is 4
next b calls f() and d is 5, therefore b is 5
finally, a is c+b or 9
and d has ended up as 5 due to side effects in f()
Here's compiler output of the relevant section
As you can see it sets c( c(SB)
), then b, then 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)
( to generate this output I used go tool compile -S -N abcd.go > abcd.s
The actual code line numbering is from a slightly simplified version with the fmt import and print statements removed )
this is with go version go1.11.4 linux/amd64
Tried the same with go version go1.12.4 linux/amd64, with the same result