面试题答案
一键面试在Go语言中,以下常见情况会导致内存逃逸:
- 返回局部变量指针:当函数返回局部变量的指针时,该变量原本可能在栈上分配内存,但由于返回了指针,它需要在堆上分配,以确保函数结束后该变量依然可用。
package main func escape() *int { num := 10 return &num }
- 动态类型:如果变量的类型在编译时无法确定,Go编译器会将其分配到堆上。例如使用空接口
interface{}
。package main func escape2() interface{} { num := 20 return num }
- 大的结构体:当函数参数或返回值是一个较大的结构体时,为避免栈溢出,Go可能会将其分配到堆上。
package main type BigStruct struct { data [10000]int } func escape3() BigStruct { var bs BigStruct return bs }
- 闭包引用外部变量:闭包引用的外部变量可能会发生内存逃逸,因为闭包可能在函数结束后依然存在。
package main func escape4() func() int { num := 30 return func() int { return num } }