在 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 关注
- 95 浏览
添加回答
举报
0/150
提交
取消