前端之家收集整理的这篇文章主要介绍了
Go_闭包_基础理解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
301_0@Golang
支持闭包
@H_
301_0@1 什么是闭包
@H_
301_0@
闭包就是一个匿名
函数和一个外部变量(成员变量)组成的一个整体
@H_
301_0@
通俗的讲就是一个匿名
函数中引用了其外部
函数内的一个变量而这个变量和这个匿名
函数的组合就叫闭包
@H_
301_0@
如下
代码所示
@H_
301_0@
func closure1() func() int{
i :=0
return func() int{
i++ //该匿名函数引用了closure1函数中的i变量故该匿名函数与i变量形成闭包
return i
}
}
2理解闭包
@H_
301_0@
如果第一次使用闭包一定会想(以上述
代码为例) closure1()返回一个匿名
函数 比如 f:=closure1() 然后我再其他的
函数内部多次
调用f() 会有什么结果呢
@H_
301_0@
如下
代码所示
@H_
301_0@
f := closure1()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
答案是 1,2,3,4 一开始还不太理解 后来回过头来想想 闭包就是一个匿名
函数加一个变量啊
@H_
301_0@
在闭包中持有该变量的引用 而匿名
函数所操作的变量一直是该闭包中的变量的引用
@H_
301_0@
所以多次
调用f()
函数操作的是同一个变量i,那么值逐渐增长也就不奇怪了
@H_
301_0@
另外要注意的是每次
调用closure1()都会产生一个新的闭包 而每次产生闭包时因为有个i:=0的操作所以每次产生的i也都是不同的变量
@H_
301_0@所以每个闭包中的引用变量i都是不同的
@H_
301_0@
如下
代码所示
@H_
301_0@
f := closure1()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
d := closure1()
fmt.Println(f())
fmt.Println(d())
fmt.Println(f())
结果是1,2,3,4,5,1,6 由此可知
@H_
301_0@
通过clousre1()
生成的闭包中的匿名
函数d()
调用时并未对之前一个闭包所
生成的引用变量产生影响
@H_
301_0@
所以在
调用完d()后再次
调用f()
输出的值是6
@H_
301_0@3 闭包形成条件
@H_
301_0@
如果理解了上面 那么闭包的形成条件也就应该理解了
@H_
301_0@
1,一个匿名
函数引用了其外部
函数的变量---注意 外部
函数的变量即成员变量而不是
全局变量
@H_
301_0@
2,该匿名
函数以独立出
生成该匿名
函数的
函数了,并且该
函数已结束 这个匿名
函数将会被其他的
函数体所
调用
@H_
301_0@
如果符合以上两点就会
生成一个闭包
@H_
301_0@Golang学习笔记 如果有错欢迎指正