在 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}或者它是否完全按照編寫的方式編譯,這意味著為調用funcB任何時間的定義分配了新內存?FuncA
2 回答

眼眸繁星
TA貢獻1873條經驗 獲得超9個贊
嵌套函數作為閉包編譯一次。嵌套函數使用的封閉范圍內的所有變量都放在堆上,并傳遞給嵌套函數。在以下代碼段中:
func FuncA() int {
a := 0
funcB := func() int {
return a
}
return funcB()
}
編譯后的代碼相當于:
type closureB struct {
a int
}
func FuncA() int {
c:=new(closureB)
c.a=0
return funcB(c)
}
func funcB(c *closureB) int {
return c.a
}
確切的細節取決于運行時和編譯器實現。

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
嵌套函數編譯一次。
因為 FuncB 不會關閉周圍范圍內的變量,所以 FuncA 不會分配堆內存。
如果 FuncB 關閉周圍范圍內的任何變量,那么這些變量將分配在堆上。函數本身被編譯一次。
- 2 回答
- 0 關注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消