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

}

或者它是否完全按照编写的方式编译,这意味着为调用funcB任何时间的定义分配了新内存?FuncA


三国纷争
浏览 96回答 2
2回答

眼眸繁星

嵌套函数作为闭包编译一次。嵌套函数使用的封闭范围内的所有变量都放在堆上,并传递给嵌套函数。在以下代码段中: 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}确切的细节取决于运行时和编译器实现。

翻阅古今

嵌套函数编译一次。因为 FuncB 不会关闭周围范围内的变量,所以 FuncA 不会分配堆内存。如果 FuncB 关闭周围范围内的任何变量,那么这些变量将分配在堆上。函数本身被编译一次。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go