Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放…
函数 + 引用环境 = 闭包
闭包就是函数返回一个匿名函数,而在这个函数存活的期间,该函数所引用的变量都不会消亡
同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。

一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,函数是编译期静态的概念,而闭包是运行期动态的概念。
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90
引用go官方文档中的一个例子,可以看到在pos和neg两个函数存活的周期内,他们各自所持有的sum变量是一直存活的。(这里的sum值随着每一次对应函数的调用都会增长传入的X)
0=0+0 0=0+0
1 = 0+0 -2+-2+0
3 = 1+2 -6=-2+-2*2
········
网友评论