在 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中文網其他相關文章!