Go中的闭包

简介:

闭包是很多语言必备的功能了,golang也不例外。

先看下面的这个例子:

复制代码
package main

import "fmt"

func adder() func(int) int {
     sum := 0
     return func(x int) int {
          sum += x
          return sum
     }
}

func main() {
     pos, neg := adder(), adder()
     for i := 0; i < 10; i++ {
          fmt.Println(
               pos(i),
               neg(-2*i),
          )
     }
}
复制代码

运行返回结果:

复制代码
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90
复制代码

这个就是Go中的闭包,一个函数和与其相关的引用环境组合而成的实体。

 

关于闭包的概念《闭包的概念、形式和应用》一文已经说的很清楚了。

 

个人理解: 

其实理解闭包的最方便的方法就是将闭包函数看成一个类,一个闭包函数调用就是实例化一个类。

然后就可以根据类的角度看出哪些是“全局变量”,哪些是“局部变量”了。

比如上例中的adder函数返回func(int) int 的函数

pos和neg分别实例化了两个“闭包类”,在这个“闭包类”中有个“闭包全局变量”sum。所以这样就很好理解返回的结果了。

目录
相关文章
|
7月前
|
Go
Go 语言使用 goroutine 运行闭包的“坑”
Go 语言使用 goroutine 运行闭包的“坑”
38 0
|
4天前
|
Go C++
go 语言回调函数和闭包
go 语言回调函数和闭包
|
7月前
|
Go 自然语言处理 编译器
Go 学习笔记-Go 词法解析
Go 学习笔记-Go 词法解析
52 0
Go 学习笔记-Go 词法解析
|
9月前
|
存储 Rust 算法
Go中的匿名函数与闭包
Go中的匿名函数与闭包
50 0
|
11月前
|
Go 容器
【Go 进阶】Go 语言到底是值传递,还是引用传递?(二)
【Go 进阶】Go 语言到底是值传递,还是引用传递?(二)
|
11月前
|
Java Go
【Go 进阶】Go 语言到底是值传递,还是引用传递?(四)
【Go 进阶】Go 语言到底是值传递,还是引用传递?(四)
|
11月前
|
编译器 Go
【Go 进阶】Go 语言到底是值传递,还是引用传递?(三)
【Go 进阶】Go 语言到底是值传递,还是引用传递?(三)
|
安全 Go
Go函数下篇:defer和闭包
Go函数下篇:defer和闭包
|
JavaScript 前端开发 Java
|
Go
Go | 闭包的使用
Go | 闭包的使用
88 0
Go | 闭包的使用