闭包
# 一、闭包
# 闭包(closure)
- 一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或者外部函数中直接定义的变量),并且该外层函数的返回值就是这个内层函数.
- 这个内层函数和外层函数的局部变量,统称为闭包结构.
- 每当新调用一次外层函数,就会产生新的外层函数中的局部变量;而内层函数要访问对应的外层函数中的局部变量
# 局部变量的生命周期
- 正常的局部变量随着函数调用而创建,随着函数的结束而销毁
- 但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还是要继续使用.
# 示例代码
package main
import "fmt"
func main() {
/*
go语言支持函数式编程:
支持将一个函数作为另一个函数的参数.
也支持将一个函数作为另一个函数的返回值.
闭包(closure)
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的的参数,或者外部函数中直接定义的变量),并且该外层函数的返回值就是这个内层函数.
这个内层函数和外层函数的局部变量,统称为闭包结构.
局部变量的生命周期:
正常的局部变量随着函数调用而创建,随着函数的结束而销毁
但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还要继续使用.
*/
res1 := incrment() //res1 = fun
fmt.Printf("%T\n", res1)
fmt.Println(res1)
v1 := res1()
fmt.Println(v1)
v2 := res1()
fmt.Println(v2)
fmt.Println(res1())
fmt.Println(res1())
fmt.Println(res1())
fmt.Println(res1())
res2 := incrment()
fmt.Println(res2)
v3 := res2()
fmt.Println(v3)
fmt.Println(res2())
fmt.Println(res1())
}
func incrment() func() int { // 外层函数
//1.定义了一个局部变量
i := 0
//2.定义了一个匿名函数,连续自增并返回
fun := func() int { //内层函数
i++
return i
}
//3.返回该匿名函数
return fun
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
上次更新: 2024/04/09, 16:48:42
- 01
- AWS NAT-NetWork-Firwalld配置(一)04-09
- 02
- AWS NAT-NetWork-Firwalld配置(二)04-09
- 03
- kubernetes部署minio对象存储01-18