首頁  >  文章  >  後端開發  >  Go 的編譯器如何處理巢狀函數?

Go 的編譯器如何處理巢狀函數?

WBOY
WBOY轉載
2024-02-05 21:39:131188瀏覽

Go 的编译器如何处理嵌套函数?

問題內容

在 go 中寫巢狀函數時,編譯器如何處理它?它是變成另一個函數並放在程式碼之外,還是在呼叫父函數時重新建立它?

例如:

func funca() int {
    a := 0
    funcb := func(_a int) int {
        return _a
    }
    return funcb(a)
}

這個函數是如下編譯的嗎?

func FuncA() int {
    a := 0
    return _funcB(a)
}
func _funcB(_a int) int {
    return _a
}

或它是否完全按照編寫的方式編譯,這意味著每當呼叫 funca 時都會為 funcb 的定義分配新記憶體?


正確答案


巢狀函數編譯一次。

由於 FuncB 不會關閉周圍作用域中的變量,因此 FuncA 不會分配堆記憶體。

如果 FuncB 關閉周圍範圍內的任何變量,那麼這些變量將在堆上分配。函數本身被編譯一次。

以上是Go 的編譯器如何處理巢狀函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除