有关闭包的一般解释,请参见JavaScript 闭包如何工作?
Go 闭包到底是如何在内存中布局的?
以以下函数为例:
type M int
func (m *M) Adder(amount int) func() {
return func() {
*m = *m + amount
}
}
当我们的代码调用a := m.Adder()
,堆上分配了多少内存以及它是什么样的?返回多少内存func()
值占用(无论它最终在内存中的什么位置)?
Go 编程语言
规格
函数字面量
函数字面量表示匿名函数。
FunctionLit = "func" Signature FunctionBody .
func(a, b int, z float64) bool { return a*b < int(z) }
函数文字可以分配给变量或直接调用。
f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)
函数字面量是闭包:它们可以引用定义在
周围的函数。然后这些变量在
围绕函数和函数文字,它们作为
只要它们可以访问。
闭包可以引用定义在
周围的函数。然后这些变量在
围绕函数和函数文字,它们作为
只要它们可以访问。
在函数调用中幸存下来的变量被放置在堆上。在 Go 中,闭包确实就是这么简单。
例如,
func closure() func() *byte {
var b [4 * 1024]byte
return func() *byte {
return &b[0]
}
}
A closure()
call 是两次堆分配,一次分配 16 (= 8 + 8 on amd64) 字节
struct { F uintptr; b *[4096]byte }
一个为 4096 字节
[4096]byte
总共 4112 字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)