198
社区成员
发帖
与我相关
我的任务
分享对于闭包的中文含义,我们可以这样去理解,就是内部变量,正常来说是外部不能访问到的,除非是声明为全局变量,但是全局变量存在很多缺点,比如生命周期长,一直占据着内存,既然是全局,所以所有的函数都是可以访问它,这对于有bug的情况,维护要困难,而且名称多了也容易造成重复的bug,为了解决这个缺点,我们使用到了闭包,可以访问函数内部的变量,能够将函数内部和函数外部连接起来。很多语言都有支持的,我们来看下go语言中的闭包
实际代码中,就是函数里面新建一个函数,新建的函数可以访问外面的函数中的变量,举个示例:
package main
import "fmt"
func test1() func() int {
i := 22
return func() int {
i *= 2
return i
}
}
func main() {
t := test1()
for i := 0; i < 3; i++ {
fmt.Println(t())
}
}
/*
44
88
176
*/
这个例子中的test1函数里面有个匿名函数,匿名函数中可以访问它外面的i变量,换种理解思路就是说,匿名函数跟外面的变量等一起都属于test1函数,打包给了这个函数一样,这个就是闭包的概念。
再看个带参数的例子巩固下:
package main
import "fmt"
func test2() func(a1 int) int {
i := 22
return func(a1 int) int {
i = i * a1
return i
}
}
func main() {
t := test2()
for i := 0; i < 3; i++ {
fmt.Println(t(3))
}
}
/*
66
198
594
*/
关于闭包等其他GO中特性可以访问:Go语言进阶,闭包、指针、并发