闭包

ace_kylin · 2018-10-11 12:55:31 · 1152 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-10-11 12:55:31 的文章,其中的信息可能已经有所发展或是发生改变。

基本概念

闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。

闭包的价值

闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

j := 5
    a := func() func() {
        i := 10
        return func() {
            fmt.Println(j, i)
        }
    }()
    a()
    j *= 2
    a()

输出:

5 10
10 10

example2:

f := add
    fmt.Println(f()(1))
    fm := add()
    fmt.Println(fm(10))
    fmt.Println(fm(100))
    fmt.Println(fm(1000))

}
func add() func(int) int {
    x := 0
    return func(i int) int {
        x += i
        return x
    }
}

输出:

1
10
110
1110

example3:

picture := suffix(".jpg")
    text := suffix(".txt")

    fmt.Println(picture("hello.jpg"))
    fmt.Println(text("hello"))
}
func suffix(su string) func(string) string {
    return func(name string) string {
        if strings.HasSuffix(name, su) {
            return name
        }
        return name + su
    }
}

输出:

hello.jpg
hello.txt

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

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

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