【Golang系列】-闭包

2022-03-14

闭包

闭包可以理解成:定义在一个函数内部的函数,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。或者说是函数和其引用环境的组合体。
闭包指的是一个函数和与其相关的引用环境组合而成的实体。
简单来说,闭包=函数+引用环境

package main

import "fmt"

//返回一个函数
func add() func(int)int{
    var x int
    return func(y int) int {
        x += y
        return x
    }
}

func main(){
    var f = add()
    fmt.Println(f(10))
    fmt.Println(f(20))
    fmt.Println(f(30))
    fmt.Println("==========")
    f1 := add()
    fmt.Println(f1(40))
    fmt.Println(f1(50))
}

结果:
10
30
60
==========
40
90
[Done] exited with code=0 in 0.82 seconds

变量f 是一个函数并且它引用了其外部作用域的x变量,此时f就是一个闭包,在f的声明周期内,变量x也一直有效,闭包进阶:
进阶1

package main

import "fmt"

//返回一个函数
func add(x int) func(int) int {
    return func(y int) int {
        x += y
        return x
    }
}

func main() {
    var f = add(10)
    fmt.Println(f(10))
    fmt.Println(f(20))
    fmt.Println(f(30))
    fmt.Println("==========")
    f1 := add(20)
    fmt.Println(f1(40))
    fmt.Println(f1(50))
}

进阶2:

进阶3:

闭包其实并不复杂,只要记住 闭包= 函数+引用环境