Golang支持闭包
1 什么是闭包
闭包就是一个匿名函数和一个外部变量(成员变量)组成的一个整体
通俗的讲就是一个匿名函数中引用了其外部函数内的一个变量而这个变量和这个匿名函数的组合就叫闭包
如下代码所示
func closure1() func() int{ i :=0 return func() int{ i++ //该匿名函数引用了closure1函数中的i变量故该匿名函数与i变量形成闭包 return i } }2 理解闭包
如果第一次使用闭包一定会想(以上述代码为例) closure1()返回一个匿名函数 比如 f:=closure1() 然后我再其他的函数内部多次调用f() 会有什么结果呢
如下代码所示
f := closure1() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f())答案是 1,2,3,4 一开始还不太理解 后来回过头来想想 闭包就是一个匿名函数加一个变量啊
在闭包中持有该变量的引用 而匿名函数所操作的变量一直是该闭包中的变量的引用
所以多次调用f()函数操作的是同一个变量i,那么值逐渐增长也就不奇怪了
另外要注意的是每次调用closure1()都会产生一个新的闭包 而每次产生闭包时因为有个i:=0的操作所以每次产生的i也都是不同的变量
所以每个闭包中的引用变量i都是不同的
如下代码所示
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 由此可知
通过clousre1()生成的闭包中的匿名函数d()调用时并未对之前一个闭包所生成的引用变量产生影响
所以在调用完d()后再次调用f()输出的值是6
3 闭包形成条件
如果理解了上面 那么闭包的形成条件也就应该理解了
1,一个匿名函数引用了其外部函数的变量---注意 外部函数的变量即成员变量而不是全局变量
2,该匿名函数以独立出生成该匿名函数的函数了,并且该函数已结束 这个匿名函数将会被其他的函数体所调用
如果符合以上两点就会生成一个闭包
Golang学习笔记 如果有错欢迎指正
有疑问加站长微信联系(非本文作者)