golang多重赋值时, 如何实现值得交换?
golang代码
package main
import "fmt"
//GOOS=linux GOARCH=386 go tool compile -S main.go >> main.S
//go build -gcflags="-N -l -S" main.go
func main() {
a := 1
b := 9
a, b = b, a
fmt.Println("a:", a, "b:", b)
}
查看汇编代码:
MOVQ $1, "".a+56(SP) //将1存入栈帧SP,偏移位置56,别名a
MOVQ $9, "".b+48(SP) //将9存入栈帧SP,偏移位置48,别名b
MOVQ "".a+56(SP), AX //将a的值存入寄存器 AX
MOVQ AX, ""..autotmp_3+64(SP) //将AX的值存入栈帧SP,偏移位置64,别名autotmp_3
MOVQ "".b+48(SP), AX //将b的值存入寄存器 AX
MOVQ AX, "".a+56(SP) //将AX的值存入栈帧SP,偏移位置56,别名a
MOVQ ""..autotmp_3+64(SP), AX //将autotmp_3的值存入寄存器AX
MOVQ AX, "".b+48(SP) //将AX的值存入栈帧SP,偏移位置48,别名b
也就是说底层实现仍然使用了中间变量 autotmp_3 .