闭包和作用范围示例
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 可以访问同一个变量,该变量需要为包变量。
- 点赞
- 收藏
- 关注作者
评论(0)