闭包是什么
闭包是由函数及其相关引用环境组合而成的实体,即:闭包 = 函数 + 引用环境。 一般的函数都有函数名,而匿名函数没有。匿名函数不能独立存在,但可以直接调用或者赋值 于某个变量。匿名函数也被称为闭包,一个闭包继承了函数声明时的作用域。在 Go 语言中,所有 的匿名函数都是闭包。
有个不太恰当的例子:可以把闭包看成是一个类,一个闭包函数调用就是实例化一个类。闭包在运 行时可以有多个实例,它会将同一个作用域里的变量和常量捕获下来,无论闭包在什么地方被调用(实 例化)时,都可以使用这些变量和常量。而且,闭包捕获的变量和常量是引用传递,不是值传递。
举个简单的例子:
func main() {
var a = Accumulator()
fmt.Printf("%d\n", a(1))
fmt.Printf("%d\n", a(10))
fmt.Printf("%d\n", a(100))
fmt.Println("------------------------")
var b = Accumulator()
fmt.Printf("%d\n", b(1))
fmt.Printf("%d\n", b(10))
fmt.Printf("%d\n", b(100))
}
func Accumulator() func(int) int {
var x int
return func(i int) int {
fmt.Printf("%+v, %+v-", &x, x)
x += i
return x
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
执行结果是:
0xc0000140f0, 0-1
0xc0000140f0, 1-11
0xc0000140f0, 11-111
------------------------
0xc0000140f8, 0-1
0xc0000140f8, 1-11
0xc0000140f8, 11-111
1
2
3
4
5
6
7
2
3
4
5
6
7
闭包引用了 x 变量,a,b 可看作 2 个不同的实例,实例之间互不影响。实例内部,x 变量 是同一个地址,因此具有 “累加效应”。
上次更新: 5/9/2023, 10:58:32 AM