如何在 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

我们可以注意到上述输出中的差异,这清楚地表明它们包含不同的状态。


相关文章