闭包和作用范围示例

举报
码乐 发表于 2025/04/11 09:45:35 2025/04/11
【摘要】 1 简介Go 语言提供了一个称为匿名函数的特殊功能。匿名函数可以形成一个闭包。闭包是一种特殊类型的匿名函数,它引用在函数本身之外声明的变量。它类似于访问在函数声明之前可用的全局变量。这意味着这些函数几乎可以在任何地方使用。这将为函数创建一个新属性,以了解其周围环境。此属性称为 闭包closure 属性。什么是 Golang 中的闭包?当 Go 中的匿名函数可以访问其周围环境时,就会发生 C...

1 简介

Go 语言提供了一个称为匿名函数的特殊功能。匿名函数可以形成一个闭包。闭包是一种特殊类型的匿名函数,它引用在函数本身之外声明的变量。它类似于访问在函数声明之前可用的全局变量。这意味着这些函数几乎可以在任何地方使用。这将为函数创建一个新属性,以了解其周围环境。此属性称为 闭包closure 属性。

  • 什么是 Golang 中的闭包?

当 Go 中的匿名函数可以访问其周围环境时,就会发生 Closure。然后它可以保持自己的独特状态。然后,当我们创建函数的新实例时,状态将变得孤立。

2 闭包

在 Go 中创建 Closure
当声明匿名函数时,可以创建闭包。该函数可以访问其周围的状态,并且其状态变得唯一。

	var x = 0

func increment() int {
    x++
    return x
}

func main() {
    fmt.Println(increment())
    fmt.Println(increment())
}

变量 x 未作为参数传递给匿名函数,但该函数可以访问它。在这个例子中,有一个小问题,因为将在 main 中定义的任何其他函数都可以访问全局变量 x,并且它可以在不调用 counter 函数的情况下更改它。因此,闭包还提供了另一个方面,即数据隔离。

我们也可以之间在main函数使用匿名函数

  func main() {
      x := 42
      fmt.Println(x)
      {
          fmt.Println(x)
          y := "功劳属于在擂台上的人。"
          fmt.Println(y)
      }
      // fmt.Println(y) // outside scope of y
  }

3 闭包基础上的包装器

Go 闭包是一个嵌套函数,它允许我们在外部函数关闭后访问外部函数的变量。 嵌套函数返回一个函数,这里的一个嵌套函数。嵌套函数的工作方式与普通函数类似

func wrapper() func() int {
    x := 0
    return func() int {
        x++
        return x
    }
}

func main() {
    increment := wrapper()
    fmt.Println(increment())
    fmt.Println(increment())
}

函数完成运行之后,闭包也会引用变量 x,但 increment() 函数之外的其他代码都无法访问此变量。这就是在函数调用之间保持数据持久性的方式,同时将数据与其他代码隔离开来。

Closure 帮助我们限制多个函数使用的变量范围如果没有闭包,则两个或多个 func 可以访问同一个变量,该变量需要为包变量。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。