Go 的编译器如何处理嵌套函数?

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
}

登录后复制

或者它是否完全按照编写的方式编译,这意味着每当调用 funca 时都会为 funcb 的定义分配新内存?

正确答案

嵌套函数编译一次。

由于 FuncB 不会关闭周围作用域中的变量,因此 FuncA 不会分配堆内存。

如果 FuncB 关闭周围范围内的任何变量,那么这些变量将在堆上分配。函数本身被编译一次。

以上就是Go 的编译器如何处理嵌套函数?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!