面试题答案
一键面试在Go语言中,闭包涉及的变量内存分配遵循以下规则:
- 分配到栈上:
- 如果闭包函数的生命周期在其外层函数结束时就结束,并且闭包所引用的变量的生命周期也和外层函数一样,那么这些变量会分配到栈上。
- 例如:
package main
import "fmt"
func outer() {
num := 10
inner := func() {
fmt.Println(num)
}
inner()
}
在这个例子中,inner
闭包引用了num
变量,但是inner
闭包的调用在outer
函数内部完成,当outer
函数返回时,inner
闭包和num
变量都不再被使用,所以num
变量会分配到栈上。
2. 分配到堆上:
- 当闭包在其外层函数返回后依然被使用,那么闭包所引用的变量会分配到堆上。
- 例如:
package main
import "fmt"
func outer() func() {
num := 10
inner := func() {
fmt.Println(num)
}
return inner
}
在这个例子中,outer
函数返回了inner
闭包,inner
闭包引用了num
变量。由于outer
函数返回后,inner
闭包可能依然会被调用,所以num
变量会分配到堆上,以保证inner
闭包在后续调用时能正确访问num
。