概念
闭包就是一个函数与其相关的引用环境组成的一个整体。
闭包本质其实是一个函数,但是这个函数会用到函数外的变量,它们共同组成的整体我们叫做闭包。
简单举例说明
package main
import (
"fmt"
)
//测试小程序 累加器
func AddUpper () func (int) int {
var n int = 10
return func (x int) int {
n = n + x
return n
}
}
func main(){
test := AddUpper() //test变量接收Addupper返回的函数
//因为Addupper返回的结果是一个函数,test(1)传参是1,
//那么其实就是把1传参给Addupper里的int 参数x,x在使用的时候会和外面的n相加
//那么x+n :1+10 =11
fmt.Println(test(1)) //11
//下面的结果会做说明
fmt.Println(test(2)) //13
fmt.Println(test(3)) //16
}
D:goprojectsrcmain>go run hello.go
11
13
16
当反复调用test函数时,因为n是只初始化一次,因此每次调用一次就进行累计,而不会初始化。变量n永远隐式存在于test中
进一步说明
//其实下面这块代码就是一个简单的闭包
var n int = 10
return func (x int) int {
n = n + x
return n
}
//返回的是一个匿名函数,但是这个匿名函数引用到了函数外的变量n,但是这个匿名函数会和这个n形成一个引用关系的整体,构成闭包