前言
构建闭包原则:
- 函数A中还有一个函数B,并且函数A返回了函数B
- 函数B调用了函数A的形参
- main函数里调用函数A
基本原理
正常情况下,函数被调用执行完毕后,函数的形参将被释放回收。
但当函数是一个闭包后,这里假设是函数A。
此时C=函数A
, 而函数A返还函数B,因此C=函数B
,函数A已被调用完毕,按理说函数A的形参A应该被回收。
因为C还存在
,故而函数B中调用的函数A的形参A无法被回收,因此,形参A就可以一直存活下来。
那么,每当你执行一次C,函数B就执行一次,形参A因为无法被回收,也会一直保持最新的数据。
举例
package main
import "fmt"
// 返回func(y int) int 函数
func fca(x int) func(y int) int{
return func(y int) int {
x+=y
return x
}
}
func fcb(startNum,step,time int) {
fmt.Printf("初始数(startNum):%d, 步长(step)%d, 迈步次数(time):%d\n",startNum, step, time)
nextNum := fca(startNum)
fmt.Printf("nextNum被赋值,即nextNum等函数func(y int) int{}, 此时func中引用了形参x:1\n")
for i:=1;i<=time;i++ {
fmt.Printf("执行nextNum(step) {x+=y}, 返回x:%d\n",nextNum(step))
if i == 3 {
fmt.Printf("重新赋值nextNum,导致nextNum释放,进而释放变量x,x重新被赋值为startNum。\n")
nextNum = fca(startNum)
}
}
}
func main(){
fcb(1,2,5)
}
===
初始数(startNum):1, 步长(step)2, 迈步次数(time):5
nextNum被赋值,即nextNum等函数func(y int) int{}, 此时func中引用了形参x:1
执行nextNum(step) {x+=y}, 返回x:3
执行nextNum(step) {x+=y}, 返回x:5
执行nextNum(step) {x+=y}, 返回x:7
重新赋值nextNum,导致nextNum释放,进而释放变量x,x重新被赋值为startNum。
执行nextNum(step) {x+=y}, 返回x:3
执行nextNum(step) {x+=y}, 返回x:5