MST

星途 面试题库

面试题:Go闭包底层内存管理中栈和堆的分配情况

在Go语言中,闭包涉及到的变量在底层内存管理中,何时会分配到栈上,何时会分配到堆上?请举例说明。
25.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,闭包涉及的变量内存分配遵循以下规则:

  1. 分配到栈上
    • 如果闭包函数的生命周期在其外层函数结束时就结束,并且闭包所引用的变量的生命周期也和外层函数一样,那么这些变量会分配到栈上。
    • 例如:
package main

import "fmt"

func outer() {
    num := 10
    inner := func() {
        fmt.Println(num)
    }
    inner()
}

在这个例子中,inner闭包引用了num变量,但是inner闭包的调用在outer函数内部完成,当outer函数返回时,inner闭包和num变量都不再被使用,所以num变量会分配到栈上。 2. 分配到堆上

  • 当闭包在其外层函数返回后依然被使用,那么闭包所引用的变量会分配到堆上。
  • 例如:
package main

import "fmt"

func outer() func() {
    num := 10
    inner := func() {
        fmt.Println(num)
    }
    return inner
}

在这个例子中,outer函数返回了inner闭包,inner闭包引用了num变量。由于outer函数返回后,inner闭包可能依然会被调用,所以num变量会分配到堆上,以保证inner闭包在后续调用时能正确访问num