go☞006函数-闭包

阅读量: zyh 2020-10-06 20:15:44
Categories: > Tags:

前言

构建闭包原则:

  1. 函数A中还有一个函数B,并且函数A返回了函数B
  2. 函数B调用了函数A的形参
  3. 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