乐趣区

闭包Closure

思考

当多个函数需要使用某个变量时,我们可以把该变量定义为全局变量。
当某个变量只有一个特定函数才会使用到时,如果把它定义为全局变量,又不能保证其它函数不会使用它,这时候该怎么办呢?
比如统计某个函数的访问次数,如果可以在函数内部定义一个变量,来记录其被访问到次数,岂不美哉?

定义

闭包是匿名函数的一种特殊用法,其引用了匿名函数外部的变量。用法与普通函数引用全局变量有一定的相似之处,但又不完全一样,就像是一个函数内部的全部变量。使用闭包可以达到数据隔离的目的。

举例

package main

import "fmt"

func main() {counterFun := newCounter()
    fmt.Println(counterFun())    // 输出 1
    fmt.Println(counterFun())    // 输出 2
}

func newCounter() func() int {
    n := 0
    return func() int {
        n += 1
        return n
    }
}

例子中的 newCounter 函数内部定义了一个匿名函数,并引用了变量 n,最后将该匿名函数作为 newCounter 函数的返回值。
main 函数中将 newCounter 返回的匿名函数赋给了变量 counterFun,这时候就相当于有个 n 与 counterFun 绑定了起来,只有 counterFun 能访问这个 n,并且每次访问 counterFun 都会将 n 递增 1,这就达到了统计 counterFun 执行次数的目的。
PS:这里统计的函数调用次数并不是 newCounter 的,而是 counterFun 的。
比如我们新定义一个 counterFun2,这时候统计次数又会从 0 重新开始。

退出移动版