闭包

1.1 闭包概念

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

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

贴士:闭包( Closure)在某些编程语言中也被称为 Lambda表达式(如Java)

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

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
19
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
13
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
}