面试题答案
一键面试Go语言闭包在内存占用方面的特点
- 延长变量生命周期:闭包会使得其内部引用的外部变量的生命周期延长。正常情况下,函数结束时其局部变量会被销毁,但如果局部变量被闭包引用,这些变量会一直存在,直到闭包不再被使用。例如,在下面代码中
x
作为外部函数的局部变量,由于被闭包f
引用,在f
使用完之前不会被销毁。 - 额外内存开销:闭包本身也会占用一定的内存空间,用于存储其引用的环境(即外部变量)以及函数体等信息。这意味着相比普通函数,闭包会带来一些额外的内存占用。
闭包中的变量对内存占用影响的示例
package main
import (
"fmt"
)
func outer() func() int {
x := 10
return func() int {
x++
return x
}
}
func main() {
f := outer()
fmt.Println(f()) // 输出 11
fmt.Println(f()) // 输出 12
}
在上述代码中,outer
函数返回一个闭包。闭包内部引用了outer
函数的局部变量x
。每次调用闭包f
时,都会对x
进行操作并返回新的值。由于x
被闭包引用,它不会随着outer
函数的结束而被销毁,从而持续占用内存。如果有多个闭包同时引用相同的外部变量,这些闭包共享对该变量的引用,不会重复创建变量实例,但会增加对该变量内存空间的引用计数,只有当所有引用该变量的闭包都不再使用时,该变量占用的内存才会被释放。