Golang中的闭包实现如下:
一、闭包定义
闭包是指有权访问另一个函数作用域中的变量的函数。
例如:
func add() func(int) int {
var x int
return func(y int) int {
x += y
return x
}
}
函数 add() 返回了一个内层函数。
这个内层函数可以访问外层函数add()的变量x。
这就形成了一个闭包。
二、作用域链
闭包实现依赖作用域链:
- 内层函数可以访问外层所有变量
- 外层函数形成一个作用域
- 内层函数形成另一个作用域,并嵌套其中
- 这样就形成了作用域链
三、变量保存
外层函数变量会被保存到闭包函数中。
包括值和引用类型:
func main() {
adder := add()
adder(10) // x 为 10
adder(20) // x 为 30
fmt.Println(x) // 报错,x 不在作用域中
}
这里外层函数的x会被保存到 adder()这个闭包函数中。
因此 main()中不存在x变量。
四、闭包内存
每个闭包会占用额外的内存,保存外层函数的变量。
闭包的生命周期与引用它的变量一致。
总的来说,Golang 的闭包实现包括:
- 定义 – 有权访问外层作用域的函数
- 作用域链 – 内外层函数嵌套
- 变量保存 – 闭包可以访问并修改外层函数变量
- 闭包占用内存 – 保存外层函数变量
- 生命周期 – 与引用其的变量一致
这种方式可以很好实现封装,并有效地复用代码逻辑。