我正在尝试了解go的内部原理。考虑以下代码
a,b := 10,5 b,a = a,b
上面的代码完美地交换了2个数字,a变成5,b变成10。我无法理解它是如何工作的。在第二行代码中考虑,如果将a首先分配给b,则b将为10。现在,如果将b分配给a,那么a也不应也为10。
请帮助我了解它是如何工作的
谢谢
TL; DR :反汇编表明CPU必须足够聪明才能看到正在发生的事情,并使用寄存器来避免覆盖内存中的现有值。
这个问题使我对Golang有了更多的了解,谢谢!
为了弄清楚编译器如何生成本机代码,我们需要查看它生成的汇编代码,链接器将其转换为机器代码。
我编写了一个Go程序来帮助解决这个问题:
package main import "fmt" func main() { fmt.Println(myfunction()) } func myfunction() []int { a, b := 10, 5 b, a = a, b return []int{a, b} }
go tool compile -S > swap.s然后,使用CTRL - F进行查找myfunction(这是该名称的要点:易于搜索),并找到这四行代码,它们对应myfunction于Go代码中的前两行:(请注意,这是我的64位计算机;在其他架构(例如32位)上,输出将有所不同)
go tool compile -S > swap.s
CTRL - F
myfunction
0x0028 00040 (swap.go:10) MOVQ $10, CX ; var a = 10 0x002f 00047 (swap.go:10) MOVQ $5, AX ; var b = 5 0x0036 00054 (swap.go:11) MOVQ CX, "".b+16(SP) ; copy a to *b+16 0x003b 00059 (swap.go:11) MOVQ AX, "".a+24(SP) ; copy b to *a+24
Go的反汇编对调试很有帮助:D
查看asm上的Golang文档,我们可以看到汇编器使用间接来处理值。
程序运行时,CPU足够聪明,可以看到正在发生的事情,并使用寄存器来避免覆盖现有值。
如果您有兴趣,这里是完整的拆卸说明。