闭包(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重新开始。

    原文作者:moonbamboo
    原文地址: https://segmentfault.com/a/1190000020219920
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞