背景:
之前开发一直没有注意到闭包的开发使用,今天无意间发现闭包的魅力。下面就以一个简单的示例做一个分析。
闭包:
原始含义:函数与其相关的引用环境组成一个整体,变量只需要设置一次,可以在多次调用中始终保留上次的引用值。
1、函数里面包含的子函数,子函数访问父函数的局部变量,也就是子函数与局部变量形成了一个整体。
2、通过return将子函数暴露在全局作用域,子函数就形成闭包
3、通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用return 之前的逻辑代码只能执行一次,可以理解为初始化1次,同时这个局部变量也不会被全局变量污染。
示例:
package main
import "fmt"
func main() {
t := T(10)
fmt.Println(t(1))
fmt.Println(t(2))
fmt.Println(t(3))
}
//其实可以理解为返回的函数为应用类型所以获取的值就是放在堆内存的数据,在线程内可以被引用
func T(a int) func(int) int {
b := "Hello" //函数局部变量
fmt.Println("------------", b)
return func(i int) int {
a = a + i
return a
}
}
结果:
------------ Hello
11
13
16
解析:
由上图可以知道,t:=T(10)作为一种初始化,此时直接执行了T函数中reutrn前的业务。
后面再调用t(1),t(2),t(3).会直接执行return后的业务,此时就形成了一个闭包;
T函数中的局部变量会受到保护,不被外界所干扰,仅仅提供给闭包函数内部使用。
使用场景:
GC垃圾回收机制内部,回调函数等业务需求,缺点是占用内存较大,如果只是简单的业务逻辑不需要采用闭包设计。