闭包(Closure)

moonbamboo · · 746 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

思考

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

定义

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

举例

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


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:moonbamboo

查看原文:闭包(Closure)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

746 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传