面试题答案
一键面试- 结果独立性分析:
- 每次调用
outer()
返回的闭包函数,得到的结果是独立的。因为每次调用outer()
函数,都会在其函数内部创建一个新的num
变量。
- 每次调用
- 变量
num
的作用域:num
的作用域是outer
函数内部以及其返回的闭包函数内部。在outer
函数外部无法直接访问num
变量。
- 变量
num
的生命周期:num
变量的生命周期从outer
函数被调用开始,到outer
函数返回的闭包函数不再被引用时结束。由于闭包可以“捕获”并持有其外部函数的变量,只要闭包函数还存在,num
变量就会一直存在于内存中,不会因为outer
函数执行完毕而被销毁。例如:
package main
import "fmt"
func outer() func() {
var num int = 10
return func() {
num++
return num
}
}
func main() {
f1 := outer()
f2 := outer()
fmt.Println(f1()) // 输出11
fmt.Println(f1()) // 输出12
fmt.Println(f2()) // 输出11
fmt.Println(f2()) // 输出12
}
在上述代码中,f1
和f2
是两次调用outer
返回的不同闭包,它们分别维护自己独立的num
变量。