Go 函数和方法可以返回多个值。
func learnMultiple(x, y int) (sum, prod int) {
return x + y, x * y // return two values
}
总和, 产品 := learnMultiple(10, 50)
是不是和返回一个元组类似?
我来自红宝石之地,在那里我可以返回一个数组和一个
sum, prod = ["60","500"]
我们可以轻松地查看一些编译的代码来确认幕后发生的事情。
考虑这个片段:
func f() (a, b byte) {
return 'x', 'y'
}
func main() {
a, b := f()
println(a, b)
}
如果我们反汇编创建的 ELF 二进制文件,您将看到类似这样的内容(内联已禁用,因此我们可以看到调用发生):
0000000000400c00 <main.f>:
400c00: c6 44 24 08 78 movb $0x78,0x8(%rsp)
400c05: c6 44 24 09 79 movb $0x79,0x9(%rsp)
400c0a: c3 retq
0000000000400c10 <main.main>:
(...)
400c25: 48 83 ec 10 sub $0x10,%rsp
400c29: e8 d2 ff ff ff callq 400c00 <main.f>
400c2e: 48 0f b6 1c 24 movzbq (%rsp),%rbx
400c33: 48 89 d8 mov %rbx,%rax
400c36: 48 0f b6 5c 24 01 movzbq 0x1(%rsp),%rbx
(...)
So f
只是将结果字节放入堆栈中,并且main
将它们取回并将它们放入工作寄存器中。不同的编译器也可能选择将两个作用域之间的这些值直接传递到寄存器中。
这与 C 语言编译器的操作类似,只是其规范仅定义了单个返回值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)