05-函数之闭包

1、闭包(Closure)

1.1、闭包概念

闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使己经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。

简单的说:函数+引用环境=闭包

贴士:go 的闭包在某些编程语言中也被称为 闭包(如 Python)

在闭包中可以修改引用的变量:

1
2
3
4
5
6
str := "hello"
foo := func(){ // 声明一个匿名函数
str = "world"
}
foo() // 调用匿名函数,修改str值
fmt.Print(str) // world

1.2、闭包案例一:简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func fn1(a int) func(i int) int {
return func(i int) int {
print(&a, a)
return a
}
}

func main() {

f := fn1(1) //输出地址
g := fn1(2) //输出地址

fmt.Println(f(1)) //输出1
fmt.Println(f(1)) //输出1

fmt.Println(g(2)) //输出2
fmt.Println(g(2)) //输出2
}

1.3、闭包案例二:实现累加器

1
2
3
4
5
6
7
8
9
10
11
12
func Accumulate(value int) func() int {
return func() int { // 返回一个闭包
value++
return value
}
}

func main() {
accAdd := Accumulate(1)
fmt.Println(accAdd()) // 2
fmt.Println(accAdd()) // 3
}

05-函数之闭包
https://flepeng.github.io/021-Go-31-Go-基础-05-函数之闭包/
作者
Lepeng
发布于
2024年12月2日
许可协议