变量初始化有错误吗

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