闭包概念
- 一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量;
- 并且该外层函数的返回值就是这个内层函数;
- 这个内层函数和外层函数的局部变量,统称为闭包结构;
- 局部变量的生命周期就会发生改变,正常的局部变量会随着函数的调用而创建,随着函数的结束而销毁;
- 但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还在继续使用;
代码示例
// 闭包函数
func a() func() int {
i := 0
b := func() int {
i++
return i
}
return b
}
func main() {
x := a()
fmt.Printf("x() = %v\n", x())
fmt.Printf("x() = %v\n", x())
fmt.Printf("x() = %v\n", x())
y := a()
fmt.Printf("y() = %v\n", y())
fmt.Printf("x() = %v\n", x())
fmt.Printf("y() = %v\n", y())
fmt.Printf("y() = %v\n", y())
}
运行结果
结论
- 一般场景下可能闭包不会出什么问题,大家都会尽量避免一些问题;
- 如果我们把调用闭包的地方变成一个循环,你以为i是可以累加的,结果就会出人意料了。
以上。