亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 的編譯器如何處理嵌套函數?

Go 的編譯器如何處理嵌套函數?

Go
三國紛爭 2023-03-21 10:37:01
在 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

}

確切的細節取決于運行時和編譯器實現。


查看完整回答
反對 回復 2023-03-21
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

嵌套函數編譯一次。

因為 FuncB 不會關閉周圍范圍內的變量,所以 FuncA 不會分配堆內存。

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


查看完整回答
反對 回復 2023-03-21
  • 2 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號