golang闭包使用场景之数据隔离
原文连接:https://www.geeksforgeeks.org/closures-in-golang/
Go语言提供了一种称为匿名函数的特性。匿名函数可以组成闭包。闭包是一种特殊类型的匿名函数,次匿名函数应用在匿名函数外面声明的变了。类似于全局变量,在匿名函数声明之前次变量就存在了。请看如下示例:
// Golang program to illustrate how to create a Closure
package main
import "fmt"
func main() {
// Declaring the variable
GFG := 0
// Assigning an anonympous function to a variable
counter := func() int {
GFG += 1
return GFG
}
fmt.Println(counter())
fmt.Println(counter())
}
输出如下:
1
2
解释:变量GFG
并不是作为参数传入匿名函数中去的,但是匿名函数却能访问变量GFG
。上面的示例中有一个小问题:main函数中定义的任何函数都可以访问全局变量GFG
,并且在不调用counter
函数的情况下改变GFG
的值。因此闭包提供了另一种功能:数据隔离。
请看下面的示例:
// Golang program to illustrate how to create data isolation
package main
import "fmt"
// newCounter function to isolate global variable
func newCounter() func() int {
GFG := 0
return func() int {
GFG += 1
return GFG
}
}
func main() {
// newCounter function is assigned to a variable
counter := newCounter()
// invoke counter
fmt.Println(counter())
// invoke counter
fmt.Println(counter())
}
输出如下:
1
2
解释:在newCounter
函数完成运行后,闭包依然能引用变量GFG
,但是newCouter
函数之外的其他代码是不能访问变量GFG
的。这就是如何在函数调用过程中保持数据的持久,并保持数据与其他代码隔离。