说到Go语言的闭包,不得不说说全局变量和局部变量
全局变量的特点:
1.常驻内存
2. 污染全局
局部变量的特点:
1.不常驻内存
2.不污染全局
而Go语言的闭包可以做到
1.可以让变量常驻内存
2.可以让变量不污染全局
所以闭包主要是为了避免全局变量的滥用。
闭包
1.闭包是指有权访问另一个函数作用域中的变量的函数
2.创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量
注意:
闭包里作用域返回的局部变量不会被立刻销毁回收,但过度使用闭包可能会占用更多内存,导致性能下降。
例1
func adder() func()int{
i:=10
return func()int{
return i+1
}
}
func adder1() func(x int)int{
i:=10
return func(x int)int{
i=i+x
return i
}
}
func main() {
fn := adder()
fmt.Println(fn()) //11
fmt.Println(fn()) //11
fn1 := adder1()
fmt.Println(fn1(10)) //20
fmt.Println(fn1(10)) //30
}
有人形象的概括闭包就是:函数 + 引用环境 = 闭包
同一个函数与不同引用环境组合,可以形成不同的闭包实例。
例2
func addTool() func(int) int {
var n = 10
return func(x int) int {
n = n + x
return n
}
}
func main() {
f := addTool()
fmt.Println(f(1))//11
fmt.Println(f(2))//13
fmt.Println(f(3))//16
}
对例2代码的总结:
addTool是一个函数,返回的数据类型是func(int)int
绿色代码就是闭包,返回的是一个匿名函数,但是这个匿名函数引用到函数外面的n,因此这个匿名函数就和n形成一个整体,构成闭包。
大家可以这样理解:闭包是类,函数是操作,n是字段,函数和他使用的变量构成闭包
当我们反复调用f函数时,因为n是初始化一次,因此每调用一次就进行累计。
我们搞清楚闭包的关键就是分析出返回的函数和他引用到哪些变量。
————————————————
版权声明:本文为CSDN博主「编程之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27654007/article/details/116667624