关于 Go 闭包的基础学习笔记,记录闭包的定义、状态保持和调用方式。
Go Note:闭包学习
1. 什么是闭包
闭包是指一个函数能够访问其外层作用域中的变量,即使这个函数在外部作用域之外被调用,也仍然可以保持这些变量的状态。
package main
import "fmt"
func B() func(n int) int {
i := 0
return func(n int) int {
fmt.Println("接收了:", n)
i++
fmt.Println("被调用:", i)
return i
}
}
func main() {
f := B()
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
}
2. 这个示例的重点
B() 返回的是一个函数,而不是一个普通值。这个返回函数捕获了局部变量 i。因此:
- 每次调用返回的函数时,
i不会被重置 i会保留上一次调用的值- 这正是闭包“持有状态”的核心特点
3. 运行结果
接收了: 1
被调用: 1
1
接收了: 2
被调用: 2
2
接收了: 3
被调用: 3
3
4. 学习体会
闭包最常见的用法是:
- 计数器
- 惰性计算
- 事件回调
- 资源状态管理
它的价值在于,让函数在调用时保留上下文,而不需要把状态显式地作为参数传来传去。
5. 结论
闭包不是复杂的语法,而是“函数 + 外部状态”的组合方式。它让代码更灵活,也更容易表达状态依赖的逻辑。
Author: NUPIGM
Date: 2026-09-20