面试题答案
一键面试package main
import "fmt"
// NewCounter 创建并返回一个计数器函数
func NewCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
在上述代码中,NewCounter
函数返回了一个匿名函数。这里闭包的工作原理是:匿名函数捕获并持有了 NewCounter
函数中的局部变量 count
。即使 NewCounter
函数已经返回,这个局部变量 count
也不会被销毁,因为匿名函数仍然引用它。
在函数式编程场景中,闭包起到了关键作用。它允许我们创建具有内部状态的函数,就像这里的计数器,每次调用返回递增后的数值。这个内部状态(count
)被封装在闭包中,外部代码无法直接访问和修改,只能通过闭包返回的函数进行操作,从而实现了数据的隐藏和封装,这是函数式编程和面向对象编程都很重视的特性。
func main() {
counter := NewCounter()
fmt.Println(counter())
fmt.Println(counter())
fmt.Println(counter())
}
在 main
函数中,我们创建了一个计数器实例 counter
,每次调用 counter
函数,都会使 count
变量递增并返回新的值。