Go 语言闭包详解及常见应用
1. 闭包的定义与机制
闭包(Closure)是函数和其引用环境的组合体,允许函数访问并操作其外部作用域中的变量,即使外部函数已经执行完毕。在 Go 中,闭包通过匿名函数实现,捕获的变量以引用方式传递。
Go 编译器通过 逃逸分析(Escape Analysis) 决定变量分配在栈(Stack)还是堆(Heap)。
核心特点:
- 状态保持:闭包可以保留对外部变量的引用,形成私有状态。
- 延迟绑定:变量在闭包被调用时动态求值,而非定义时。
示例:闭包基础
func counter() func() int {
count := 0
return func() int {
count++ // 捕获外部变量 count
return count
}
}
func main() {
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2 (状态被保留)
}
2. 常见应用场景
2.1 状态封装
闭包可以隐藏变量,实现类似“私有属性”的效果。
func NewBankAccount(initialBalance int) func(int) int {
balance := initialBalance
return func(amount int) int {
balance += amount
return balance
}
}
// 使用
account := NewBankAccount(100)
account(50) // 余额 150
2.2 延迟执行(Defer 增强)
结合 defer
实现资源释放或日志记录。
func logTime() func() {
start := time