MST

星途 面试题库

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

请简要阐述在Go语言编程过程中,哪些常见的代码编写方式或者操作会导致内存逃逸现象的发生,并针对每种场景举例说明。
33.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

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

  1. 返回局部变量指针
    • 原因:函数返回局部变量的指针,编译器无法确定该变量的生命周期,因此将其分配到堆上。
    • 示例
package main

func allocate() *int {
    var num int
    return &num
}
  1. 大的结构体作为参数传递
    • 原因:如果结构体较大,为避免栈溢出,Go会将其分配到堆上。
    • 示例
package main

import "fmt"

type BigStruct struct {
    data [10000]int
}

func process(s BigStruct) {
    fmt.Println(s)
}
  1. interface类型的使用
    • 原因:由于Go语言的动态类型系统,interface类型在编译期无法确定具体类型,可能导致内存逃逸。
    • 示例
package main

import "fmt"

type Animal interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "Woof"
}

func makeSound(a Animal) {
    fmt.Println(a.Speak())
}

func main() {
    dog := Dog{}
    makeSound(dog)
}
  1. 闭包引用外部变量
    • 原因:闭包会持有外部变量的引用,导致变量的生命周期延长,可能被分配到堆上。
    • 示例
package main

import "fmt"

func counter() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}