面试题答案
一键面试- 闭包与内存管理关系分析:
- 在上述代码中,
outer
函数创建了一个长度为1000000的整数切片data
。然后返回一个闭包,该闭包引用了outer
函数中的data
变量。 - 由于闭包持有对
data
的引用,只要闭包存在,data
所占用的内存就不会被垃圾回收器回收。这意味着即使outer
函数已经返回,data
的内存依然被占用。
- 在上述代码中,
- 潜在内存泄漏风险:
- 存在潜在的内存泄漏风险。如果调用
outer
函数后,返回的闭包一直被持有,那么data
占用的大量内存将无法释放,随着这种情况的不断发生,可能会导致内存耗尽,从而产生内存泄漏。
- 存在潜在的内存泄漏风险。如果调用
- 改进方法:
- 如果闭包不需要操作
data
,只是打印其长度,可以将长度值传递给闭包,而不是让闭包引用整个data
切片。修改后的代码如下:
- 如果闭包不需要操作
package main
import (
"fmt"
)
func outer() func() {
data := make([]int, 1000000)
length := len(data)
return func() {
fmt.Println(length)
}
}
- 这样,闭包只持有一个整数(切片的长度),而不是整个大切片,当
outer
函数返回后,data
切片可以被垃圾回收器正常回收,避免了潜在的内存泄漏。