如何在 Golang 中使用闭包?
go programmingserver side programmingprogramming
为了理解什么是闭包,我们必须知道什么是匿名函数以及如何使用它们。
匿名函数
在 Go 中,匿名函数是那些没有任何名称的函数。简而言之,匿名函数在声明时不使用任何变量作为名称。
我们知道,声明函数的语法与下面类似。
func Sample(){ // 一些代码 }
虽然我们确实为上述函数(示例)指定了名称,但对于匿名函数,我们没有名称。
什么是闭包函数?
闭包函数是可以访问其周围环境的匿名函数。在 Go 中,闭包函数可以拥有自己的状态,并且当我们创建该函数的新实例时,该状态将被隔离。
好的,现在让我们考虑一个非常简单的闭包示例。
示例
考虑下面的代码。
package main import ( "fmt" ) func main() { x := 22 ff := func() { y := x / 2 fmt.Println(y) } ff() }
输出
如果我们使用命令 go run main.go 运行此代码,我们将在终端上看到以下输出。
11
在上面的代码中,我们创建了一个名为 ff 的函数闭包,其中包含 x。匿名函数 ff 可以直接访问值 x,而这个值就是 closure 属性。
闭包还提供了一种称为数据隔离的属性,闭包的状态在创建时是唯一的,这意味着每个闭包都有自己的状态。
让我们通过一个例子来理解这个概念。
示例
考虑下面的代码。
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
我们可以注意到上述输出中的差异,这清楚地表明它们包含不同的状态。