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的。这就是如何在函数调用过程中保持数据的持久,并保持数据与其他代码隔离。