Go函数和方法可以返回多个值。
func learnMultiple(x, y int) (sum, prod int) { return x + y, x * y // return two values }
总和,prod:= learningMultiple(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 (...)
因此,f只需将结果字节放入堆栈中,然后将main它们取回并放入工作寄存器中。不同的编译器也可能选择将这些值在两个作用域之间直接传递到寄存器中。
f
main
除了其规范仅定义单个返回值外,这都与C语言编译器的工作类似。