闭包概念

闭包字面定义:闭包是由函数及相关引用环境组合而形成的实体。(即:闭包=函数+引用环境)

闭包的理解:闭包是个函数,而他记住了周期性发生了什么;表现为在一个函数内部定义另一个函数。so,在本质上,闭包就是将函数内部和外部连接在一起的桥梁。

闭包的作用:

  • 闭包可以读取函数内部的变量

  • 闭包可以让函数内部的变量始终存储在内存中

闭包使用

1
2
3
4
5
6
func foo(i int) func() int {
    return func() int {
        i++
        return i
    }
}

函数 foo 返回一个函数签名为:func() int 的一个函数,该函数即为一个闭包。该函数本身没有定义变量 i , 而是引用了她所在的环境 (函数 foo) 中的变量 i

1
2
3
4
c1 := foo(0) 
c2 := foo(1) 
c1() // reference to i, i=0; return 1
c2() // reference to another i, i=1; return 2

c1 & c2 引用了不同的环境;函数 foo 每进入一次就形成了一个新的环境,对应的闭包中,函数都是同一个函数,环境却是不同的环境。

变量 i 是 foo 函数的局部变量,但其一直存储在内存中。

匿名函数

匿名函数没有函数名,该函数不能独立存在,但可以赋值给某个变量,即保存函数的地址到变量中,然后通过变量调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 定义匿名函数
func(x, y int) int {
    return x + y 
}

// 保存一个匿名函数的地址到变量中
foo := func(x, y int) int {
    return x + y
}

// 调用该函数
foo(3, 4)

亦可直接对匿名函数进行调用,调用实例如下:

1
2
3
4
5
6
func() {
    sum := 0.0
    for i:=0; i<1e6; i++ {
        sum += i
    }
}()

格式说明:表示参数列表的的一对括号必须紧跟func关键字,因为匿名函数没有名称;花括号 {} 内是函数体;最后一对括号表示对该匿名函数的调用

注:

  • 匿名函数亦称之为闭包
  • 匿名函数像所有函数一样可以接收或不接收参数
  • 闭包的另一种表述:一个闭包继承了函数声明时的作用域,作用域内的变量都被共享到了闭包的环境中,因此这些变量在闭包中被操作,直到被销毁。

See Also

Thanks to the authors 🙂