面试题答案
一键面试匿名函数闭包特性示例
package main
import "fmt"
func main() {
outerVar := 10
innerFunc := func() {
fmt.Println(outerVar)
}
innerFunc()
}
在上述代码中,innerFunc
是一个匿名函数,它定义在 main
函数内部,并引用了 main
函数中的变量 outerVar
。这就形成了闭包。
闭包环境下内部函数对外部变量引用的表现
- 可以访问外部变量:内部函数能够访问并使用外部函数作用域中的变量,如上述代码中
innerFunc
可以打印outerVar
的值。 - 外部变量生命周期延长:即使外部函数执行完毕,只要闭包函数(内部函数)仍然存在,外部变量就不会被销毁。例如:
package main
import "fmt"
func outer() func() {
outerVar := 10
innerFunc := func() {
fmt.Println(outerVar)
}
return innerFunc
}
func main() {
result := outer()
result()
}
在这个例子中,outer
函数返回了 innerFunc
。当 outer
函数执行结束后,outerVar
由于被 innerFunc
引用,其生命周期延长,innerFunc
仍然可以访问并打印 outerVar
的值。
原因解释
闭包会将其引用的外部变量和函数体打包成一个整体,这个整体称为闭包。闭包不仅仅是函数代码,还包含了函数执行所需的环境(即对外部变量的引用)。所以,内部函数在执行时,能够访问到定义它时所在的环境中的变量,即使外部函数的栈帧已经被销毁,这些变量也会因为闭包的引用而继续存在于内存中。