2 回答

TA貢獻1824條經驗 獲得超6個贊
我們可以很容易地查看一些編譯后的代碼來確認幕后發生了什么。
考慮這個片段:
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它們取回并將它們放入工作寄存器中。不同的編譯器也可能選擇將這些值在兩個作用域之間直接傳遞到寄存器中。
這與 C 語言的編譯器所做的完全相似,只是它的規范僅定義了單個返回值。

TA貢獻1780條經驗 獲得超5個贊
它類似于返回元組,從某種意義上說,某些語言(如 Python)使用元組來實現多個返回值。
但是在 Go 中沒有元組這樣的東西。返回一個值的函數在堆棧上分配一個槽來保存它。返回兩個值的函數在堆棧上分配兩個插槽來保存它們。等等…
- 2 回答
- 0 關注
- 181 瀏覽
添加回答
舉報