闭包(closure)是函数式语言实现词法作用域的技术,也称绑定。第一次读这个定义,可能有点懵,简言之,闭包就是函数值,它可以引用它的函数体所包含的变量。需要注意的是闭包不是匿名函数。
简单示例
下面创建简单闭包示例,并通过该实例学习其工作原理。首先创建函数 getLimit()
函数,其中包括 int类型limit
变量,并被设置为10,接着连续调用该函数:
main.go
package main
import "fmt"
func getLimit() func() int {
limit := 10
return func() int {
limit -= 1
return limit
}
}
func main() {
limit := getLimit()
fmt.Println(limit())
fmt.Println(limit())
}
现在如果运行程序,输出如下:
$ go run main.go
9
8
为什么这很重要呢?limit
变量给绑定到 getLimit()
函数,如果再次绑定到 limit2
变量,但两者之间的状态不会相互影响:
main.go
package main
import "fmt"
func getLimit() func() int {
limit := 10
return func() int {
limit -= 1
return limit
}
}
func main() {
limit := getLimit()
fmt.Println(limit()) // 9
fmt.Println(limit()) // 8
limit2 := getLimit()
fmt.Println(limit2()) // 9
fmt.Println(limit2()) // 8
fmt.Println(limit()) // 7
}
运行程序,输出如下:
9
8
9
8
7
ok,我们已经使用Go语言成功创建了闭包实例。