为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信