面试题答案
一键面试闭包概念
在Go语言中,闭包是一个函数值,它可以引用其函数体外部的变量。闭包使得函数可以“记住”其定义时的环境,即使在该环境已经不存在时,闭包仍然可以访问和修改这些变量。
数据封装和状态保持示例
package main
import "fmt"
// counterFactory 是一个返回闭包的函数
func counterFactory() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
// 创建一个计数器实例
counter := counterFactory()
// 调用闭包函数,它会保持和更新自己的状态
fmt.Println(counter()) // 输出: 1
fmt.Println(counter()) // 输出: 2
fmt.Println(counter()) // 输出: 3
// 创建另一个计数器实例,它有自己独立的状态
anotherCounter := counterFactory()
fmt.Println(anotherCounter()) // 输出: 1
}
在上述代码中:
counterFactory
函数返回一个匿名函数,这个匿名函数就是闭包。- 闭包引用了
counterFactory
函数中的局部变量count
。尽管counterFactory
函数已经返回,其局部变量count
的生命周期应该结束,但闭包使得count
变量一直存在,并能被闭包函数持续访问和修改。 - 每次调用
counter
闭包函数时,它会增加并返回count
的值,实现了状态的保持。 - 创建的不同闭包实例(如
counter
和anotherCounter
)有各自独立的状态,互不干扰,体现了数据封装。