内容简介:Golang 的多重赋值可以用于值交换操作两个值可以方便的如下交换:四个值同样可以如下交换
Golang 的多重赋值可以用于值交换操作
两个值可以方便的如下交换:
a, b = b, a
四个值同样可以如下交换
a, b, c, d = b, c, a, d
那这个交换底层是怎么实现的呢? 我们来做个试验,看看这一段四值交换 golang 代码的的汇编代码
func main(){ a := 1 b := 2 c := 3 d := 4 a, b, c, d = b, c, a, d }
$>dlv debug main.go Type 'help' for list of commands. (dlv) b main.main Breakpoint 1 set at 0x454b6a for main.main() ~/pathToProject/main.go:3 (dlv) r Process restarted with PID 26528 (dlv) c > main.main() ~/pathToProject/main.go:3 (hits goroutine(1):1 total:1) (PC: 0x454b6a) 1: package main 2: => 3: func main() { 4: a := 1 5: b := 2 6: c := 3 7: d := 4 (dlv) disassemble TEXT main.main(SB) D:/Users/polar/go/src/mylab/main.go main.go:3 0x454b50 65488b0c2528000000 mov rcx, qword ptr gs:[0x28] main.go:3 0x454b59 488b8900000000 mov rcx, qword ptr [rcx] main.go:3 0x454b60 483b6110 cmp rsp, qword ptr [rcx+0x10] main.go:3 0x454b64 0f8619020000 jbe 0x454d83 => main.go:3 0x454b6a* 4883ec50 sub rsp, 0x50 main.go:3 0x454b6e 48896c2448 mov qword ptr [rsp+0x48], rbp main.go:3 0x454b73 488d6c2448 lea rbp, ptr [rsp+0x48] main.go:4 0x454b78 48c744242801000000 mov qword ptr [rsp+0x28], 0x1 // a := 1 main.go:5 0x454b81 48c744242002000000 mov qword ptr [rsp+0x20], 0x2 // b := 2 main.go:6 0x454b8a 48c744241803000000 mov qword ptr [rsp+0x18], 0x3 // c := 3 main.go:7 0x454b93 48c744241004000000 mov qword ptr [rsp+0x10], 0x4 // d := 4 main.go:9 0x454b9c 488b442428 mov rax, qword ptr [rsp+0x28] main.go:9 0x454ba1 4889442440 mov qword ptr [rsp+0x40], rax // temp = a main.go:9 0x454ba6 488b442420 mov rax, qword ptr [rsp+0x20] main.go:9 0x454bab 4889442428 mov qword ptr [rsp+0x28], rax // a = b main.go:9 0x454bb0 488b442418 mov rax, qword ptr [rsp+0x18] main.go:9 0x454bb5 4889442420 mov qword ptr [rsp+0x20], rax // b = c main.go:9 0x454bba 488b442410 mov rax, qword ptr [rsp+0x10] main.go:9 0x454bbf 4889442418 mov qword ptr [rsp+0x18], rax // c = d main.go:9 0x454bc4 488b442440 mov rax, qword ptr [rsp+0x40] main.go:9 0x454bc9 4889442410 mov qword ptr [rsp+0x10], rax // d = temp
很好理解了,就是编译器帮我们在栈上创建了一个临时变量 temp, 然后按顺序交换其他各个变量的值。
那么下面这种情况,会发生什么呢?
a := 1 b := 2 a, b, a = b, a, b
a 和 b 最终的值是多少?
看一下汇编代码就清楚了
main.go:5 0x454b9b 48c744241801000000 mov qword ptr [rsp+0x18], 0x1 // a:=1 main.go:6 0x454ba4 48c744241002000000 mov qword ptr [rsp+0x10], 0x2 // b:=2 main.go:7 0x454bad 488b442418 mov rax, qword ptr [rsp+0x18] main.go:7 0x454bb2 4889442428 mov qword ptr [rsp+0x28], rax // aTemp := a main.go:7 0x454bb7 488b442410 mov rax, qword ptr [rsp+0x10] main.go:7 0x454bbc 4889442420 mov qword ptr [rsp+0x20], rax // bTemp := b main.go:7 0x454bc1 488b442410 mov rax, qword ptr [rsp+0x10] main.go:7 0x454bc6 4889442418 mov qword ptr [rsp+0x18], rax // a = b main.go:7 0x454bcb 488b442428 mov rax, qword ptr [rsp+0x28] main.go:7 0x454bd0 4889442410 mov qword ptr [rsp+0x10], rax // b = aTemp main.go:7 0x454bd5 488b442420 mov rax, qword ptr [rsp+0x20] main.go:7 0x454bda 4889442418 mov qword ptr [rsp+0x18], rax // a = bTemp
相当于
aTemp = a bTemp = b a, b, a = bTemp, aTemp, bTemp
这里两个值交换的操作的原理是将两个被赋值的变量的值,都存储在临时变量里,然后再用临时变量去赋值。所以这个例子赋值顺序对结果是无影响的,其结果仍然是 a = 2, b = 1。
不用再像 C 语言那样写交换函数再内联了,相当于把脏活丢给编译器干了。
以上所述就是小编给大家介绍的《理解Golang多重赋值》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- javaScript中赋值的拷贝的理解
- 你真的理解Python中的赋值、传参吗?
- 通俗易懂理解ES6 - 变量的解构赋值
- 少说话多写代码之Python学习023——赋值语句的用户02(链式赋值、增量赋值)
- ES6 解构赋值
- 【ES6复习】解构赋值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python科学计算(第2版)
张若愚 / 清华大学出版社 / 2016-4-29 / 118
本书介绍如何用 Python 开发科学计算的应用程序,除了介绍数值计算之外,还着重介绍了如何制作交互式二维、三维图像,如何设计精巧的程序界面,如何与 C 语言编写的高速计算程序结合,如何编写声音、图像处理算法等内容。本书采用 IPython notebook 编写,所有的程序均能在本书提供的运行环境中正常运行,书中所印刷的图表以及程序输出为均为自动运行的结果,保证了书中所有程序的正确性以及可读性。......一起来看看 《Python科学计算(第2版)》 这本书的介绍吧!