MST

星途 面试题库

面试题:Go语言中导致内存逃逸的常见情况有哪些

请简要阐述在Go语言编程过程中,哪些常见的代码编写方式或场景会导致内存逃逸现象发生。
44.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言编程中,以下常见代码编写方式或场景会导致内存逃逸:

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