多变量赋值
//go:noinline
//go:nosplit
func test() (int, int) {
a, b := 1, 2
a, b = b+1, a+2
return a, b
}
func main() {
a, b := test()
println(a, b)
}
多变量赋值涉及计算规则问题,很多语言对于多变量赋值其实是个坑。Go 语言的做法先计算右边的值,然后批量对左边进行赋值。
a, b := 1, 2
没有歧义,a, b = b+1, a+2
怎么计算呢?第一种解释先计算b+1
把这个结果赋值给a
那么a = 3
,然后计算a+2
那么a = 5
那b = 5
。第二种解释是什么?先把b+1
和a+2
计算出来再进行a
和b
的赋值a
和b
都等于3。处理顺序到底是什么?我们需要用反汇编的方式来确认。
反汇编多变量赋值
$ go build -gcflags "-N -l"
$ go tool objdump -s "main\.test" test
main.go:5 MOVQ $0x0, 0x30(SP) # ret1 = 0 30(SP)
main.go:5 MOVQ $0x0, 0x38(SP) # ret2 = 0 38(SP)
main.go:6 MOVQ $0x1, 0x8(SP) # a = 1 8(SP)
main.g