什么是闭包?
百度百科是这么形容的:闭包就是能够读取其他函数内部变量的函数。(能看懂的大概是怪物)
看完概念大部分人应该都处于蒙圈的状态,所以我决定用一段代码来解释下闭包。
// 一个累加器(闭包)
func AddUpper() func (int) int {
num := 10
return func (x int) int{ //这是一个匿名函数
num = num + x
return num
}
}
func main() {
f := AddUpper() // 这个括号非常关键,与 f:= AddUpper不同!这一步相当于已经调用了AppUpper函数
fmt.Printf("f的类型是%T\n", f) // func(int) int类型,也就是说,现在的f实际是闭包内的匿名函数
fmt.Println(f(1)) // 输出11
fmt.Println(f(2)) // 输出13,而不是12
fmt.Println(f(3)) // 输出16
}
闭包函数返回的也是一个函数。
当我们用变量f
来接收闭包函数时,得到的其实是内部的匿名函数,只要变量f没有被回收,那么变量num就不会被重置。
通俗解释:当变量f接收了闭包函数时,num就相当于一个全局变量
,可以被更改并保存,而f(1)就是直接调用了匿名函数,并把1传给形参x。
注:如果我们用一个新的变量nefF
接收闭包函数时,在这个新的变量中,变量num就会被重置为10,而变量f中的num却不会被重置。
func main() {
f := AddUpper()
fmt.Printf("f的类型是%T\n", f)
fmt.Println(f(1)) // 11
fmt.Println(f(2)) // 13
fmt.Println(f(3)) // 16
newF:= AddUpper()
fmt.Println(newF (1)) // 11
fmt.Println(newF (2)) // 13
fmt.Println(newF (3)) // 16
fmt.Println(f(1)) // 17
}
闭包的概念比较抽象,建议看完依然对闭包一知半解的读者可以自己敲一敲代码,并通过代码的运行结果来反推闭包的概念,或者也可以留言一起探讨~