Golang 如何使用闭包
为了理解什么是闭包,我们必须知道什么是匿名函数以及如何使用它们。
匿名函数
在Go中,匿名函数是那些没有任何名字的函数。简单地说,匿名函数在声明时不使用任何变量作为名称。
我们知道,我们用类似的语法来声明一个函数,如下图所示。
func Sample(){
// some code
}
虽然我们确实为上述函数起了一个名字( Sample ),但在匿名函数的情况下,我们没有名字。
什么是闭合函数?
闭包函数是可以访问其周围环境的匿名函数。在 Go 中,封闭函数可以有自己的状态,当我们创建新的函数实例时,这个状态会被隔离。
好的,现在让我们考虑一个非常简单的 封闭 例子 。
例子
考虑一下下面的代码。
package main
import (
"fmt"
)
func main() {
x := 22
ff := func() {
y := x / 2
fmt.Println(y)
}
ff()
}
输出
如果我们用命令 go run main.go 运行这段代码,我们将在终端上得到以下输出。
11
在上面的代码中,我们创建了一个包含 x 的名为 ff 的函数的闭包 。 匿名函数ff可以直接访问值 x ,这又是 闭包 的属性。
闭包还提供了一个叫做数据隔离的属性,其中闭包的状态在创建时是唯一的,这只是意味着每个闭包有自己的状态。
让我们借助于一个例子来理解这个概念。
例子
请看下面的代码。
package main
import (
"fmt"
)
func ff() func() int {
z := 0
return func() int {
z += 100
return z
}
}
func main() {
x := ff()
y := ff()
fmt.Println(x())
fmt.Println(y())
x()
fmt.Println(x())
fmt.Println(y())
}
输出
如果我们用命令 go run main.go 来运行这段代码,我们会看到终端上打印出以下输出。
100
100
300
200
我们可以注意到上述输出中的差异,这清楚地表明它们包含不同的状态。