我正在尝试了解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位)上,输出将有所不同)
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足够聪明,可以看到正在发生的事情,并使用寄存器来避免覆盖现有值。
如果您有兴趣,这里是完整的拆卸说明。
问题内容: 我想使用接口交换两个数字,但是接口概念令我感到困惑。 http://play.golang.org/p/qhwyxMRj-c 这是代码和游乐场。如何使用接口并交换两个输入数字?我需要定义两个结构吗? 问题答案: 首先,类型只是接受所有值的类型,因为它是带有空方法集的接口,并且每种类型都可以满足该要求。例如没有任何方法,也没有。 对于交换两个变量的值的方法,首先需要确保这些变量实际上是可
我的代码中有错误。错误是:错误:类SwapNodes是公共的,应该在名为SwapNodes的文件中声明。java公共类SwapNodes{ ^Main.java:104:错误:内部类SwapNodes中的静态声明非法。Main公共静态void Main(String[]args){ ^modifier'static'仅允许在常量变量声明中使用。我的程序如下所示:
我是初学者,我想通过使用两个旧映射hm1和hm2创建一个新映射hm3,在该映射中,我需要第二个映射的值作为键,第一个映射的值作为值,例如:如果映射hm1包含a1作为key1和abc作为value1,它还包含a2作为key2和xyz作为value2,并且还有另一个映射hm2,它包含a1作为key1和b1作为value1,还包含a2作为key2和b2作为value2,那么在映射hm3中,我需要b1作为
我试图解决leetcode中的一个问题—从BST中删除节点。我们将获得BST的根节点和密钥;我们必须删除以该键为值的节点。我们可以假设所有树节点都有唯一的值。我们必须在此操作后返回根节点。(问题链接为:https://leetcode.com/problems/delete-node-in-a-bst/description/). 我编写了以下代码: 我想知道为什么评论下面的行实际上并没有改变根节
问题内容: 我正在研究一个反向索引的搜索程序。索引本身是一个字典,其键是术语,其值本身是短文档的字典,ID号是键,其文本内容是值。 为了对两个词执行“与”搜索,因此我需要与他们的发布列表(字典)相交。在Python中有什么明确的方法(不一定太聪明)?我首先尝试了以下方法: 问题答案: 在Python中,您可以使用运算符来计算集合的交集,而字典键是类似于集合的对象(在Python 3中): 在Pyt