MST

星途 面试题库

面试题:Go语言中什么情况下会发生内存逃逸?

请简要阐述在Go语言编程中,哪些常见的代码编写方式或场景会导致内存逃逸现象的出现,并举例说明。
29.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,以下常见情况会导致内存逃逸:

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