猿问

交换两个数字 golang

我试图了解 go 的内部结构。考虑以下代码


a,b := 10,5

b,a = a,b

上面的代码完美地交换了 2 个数字,a 变为 5,b 变为 10。我无法理解这是如何工作的。考虑在第二行代码中,如果先将 a 分配给 b,那么 b 将是 10。现在如果我们将 b 分配给 a,那么 a 也不应该是 10。


请帮助我了解这是如何工作的


隔江千里
浏览 235回答 1
1回答

千万里不及你

反汇编表明 CPU 必须足够聪明才能看到正在发生的事情并使用寄存器来避免覆盖内存中的现有值。这个问题让我对Golang有了更多的了解,谢谢!要弄清楚编译器如何生成本机代码,我们需要查看它生成的汇编代码,这些代码由链接器转换为机器代码。我写了一个小 Go 程序来帮助解决这个问题:package mainimport "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'd for myfunction(这是该名称的重点:易于搜索),并找到了这四行,它们对应myfunction于 Go 代码中的前两行:(注意这是针对我的 64 位机器;输出将在其他架构(如 32 位)上有所不同)0x0028 00040 (swap.go:10)   MOVQ    $10, CX         ; var a = 100x002f 00047 (swap.go:10)   MOVQ    $5, AX          ; var b = 50x0036 00054 (swap.go:11)   MOVQ    CX, "".b+16(SP) ; copy a to *b+160x003b 00059 (swap.go:11)   MOVQ    AX, "".a+24(SP) ; copy b to *a+24 Go 的反汇编对调试非常有帮助 :D
随时随地看视频慕课网APP

相关分类

Go
我要回答