面试题答案
一键面试在Go语言编程中,以下常见代码编写方式或场景会导致内存逃逸:
- 返回局部变量指针:
- 当函数返回局部变量的指针时,该变量原本可能在栈上分配内存,但由于返回指针使得其生命周期超出函数栈的范围,会逃逸到堆上。例如:
func getPtr() *int { num := 10 return &num }
- 传递给interface类型参数:
- 因为interface类型的动态特性,Go编译器无法在编译期确定实际类型,所以被传递的变量会逃逸到堆上。比如:
func doSomething(i interface{}) { // 函数体 } func main() { num := 10 doSomething(num) }
- 使用
go
关键字创建goroutine:- 在goroutine中引用的变量,由于其生命周期和当前函数栈不同步,会逃逸到堆上。例如:
func main() { num := 10 go func() { println(num) }() }
- 使用
make
分配较大的切片或映射:- 如果编译器无法在编译期确定切片或映射的大小,或者大小较大时,会逃逸到堆上。例如:
func main() { var n int // 假设n的值在运行时确定 slice := make([]int, n) }
- 使用反射:
- 反射操作在编译期无法确定具体类型和内存布局,所以涉及反射操作的变量通常会逃逸到堆上。例如:
func main() { num := 10 value := reflect.ValueOf(num) }