面试题答案
一键面试闭包概念
在Go语言中,闭包是一个函数值,它可以引用其外部作用域中声明的变量。即使外部函数已经返回,这些变量依然可以被闭包函数访问和修改。闭包允许将函数与其相关的环境(即该函数引用的变量)打包在一起,形成一个独立的单元。
代码示例
package main
import "fmt"
// 外部函数,返回一个闭包函数
func counter() func() int {
count := 0
// 闭包函数
return func() int {
count++
return count
}
}
在上述代码中,counter
函数返回一个匿名函数。这个匿名函数形成了一个闭包,它引用了 counter
函数内部的变量 count
。每次调用返回的匿名函数时,count
变量都会自增并返回新的值。
闭包中变量的生命周期特点
- 延长生命周期:闭包中的变量生命周期会延长,超出其原始定义的函数作用域。例如上述代码中,
count
变量本应在counter
函数返回时销毁,但由于闭包的存在,只要闭包函数还在被使用,count
变量就会一直存在。 - 共享状态:同一个外部函数多次调用返回的闭包,共享外部函数中定义的变量。例如:
func main() {
c1 := counter()
c2 := counter()
fmt.Println(c1()) // 输出1
fmt.Println(c1()) // 输出2
fmt.Println(c2()) // 输出1,因为c1和c2的count变量是相互独立的
}
每个闭包都有自己独立的状态副本,尽管它们来自同一个外部函数。