闭包

ace_kylin · · 107 次点击 · · 开始浏览    
#### 基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。 #### 闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。**将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。** ``` 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 ```
107 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传