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

在上面的代码中,我们创建了一个名为 **ff** 的函数的闭包,其中包含 **x**。匿名函数 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

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

更新于: 2022年2月21日

385 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.