掌握闭包,让你的Go代码瞬间提升逼格
什么是闭包?为什么它如此重要?
如果你对Go语言的函数理解还停留在“输入-处理-输出”的初级阶段,那么闭包将会彻底改变你的认知。闭包,说白了就是**“有记忆的函数”**,它可以记住自己诞生时的环境,即使离开了这个环境,依然能访问和操作当时的变量。
这听起来有点神奇,对吧?来看一个简单例子:
func counter() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
c := counter()
fmt.Println(c()) // 输出 1
fmt.Println(c()) // 输出 2
fmt.Println(c()) // 输出 3
}
看到没有?虽然counter函数每次调用后已经执行完毕,但内部的变量i并没有消失,而是被返回的匿名函数“捕获”了。这就是闭包的魔力——状态保持。
闭包的本质是函数 + 引用环境的组合。它不仅仅是一个函数,还附带了一个小小的“存储空间”,用来保存外部函数的变量。
闭包基础:从匿名函数到闭包
匿名函数:闭包的基础
在深入了解闭包之前,我们先来看看匿名函数——闭包的基础构建块。
匿名函数,顾名思义就是没有名字的函数,你可以直接定义并使用它:
// 定义后立即执行
result := func(a, b int) int {
return a + b
}(3, 5)
fmt.Println("结果:", result) // 输出:结果:8
// 赋值给变量使用
add := func(x, y int) int {
return x + y
}
fmt.Println(add(10, 20)) // 输出:30
匿名函数让代码更加灵活,可以随时随地定义使用,不需要像传统函数那样必须先声明再使用。
闭包的诞生
当匿名函数开始引用外部变量时,它就升级成了闭包:
func main() {
a := 10
add := func(x int) int {
return a + x // 闭包:引用了外部变量 a
}
fmt.Println(add(5)) // 输出 15
}
在这个例子中,匿名函数捕获了外部变量a,即使a超出了原本的作用域,只要add还存在,a就会一直活着。
闭包的经典应用场景
闭包不仅仅是一个学术概念,它在实际开发中有大量应用。让我们来看几个最常见的场景。
1. 状态保持器:让函数有“记忆”
闭包最常见的用途就是保存状态,比如实现计数器、累加器等:
func getAdder() func(int) int

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



