思考
当多个函数需要使用某个变量时,我们可以把该变量定义为全局变量。
当某个变量只有一个特定函数才会使用到时,如果把它定义为全局变量,又不能保证其它函数不会使用它,这时候该怎么办呢?
比如统计某个函数的访问次数,如果可以在函数内部定义一个变量,来记录其被访问到次数,岂不美哉?
定义
闭包是匿名函数的一种特殊用法,其引用了匿名函数外部的变量。用法与普通函数引用全局变量有一定的相似之处,但又不完全一样,就像是一个函数内部的全部变量。使用闭包可以达到数据隔离的目的。
举例
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重新开始。