MST

星途 面试题库

面试题:Go语言中闭包的内存占用有什么特点

请阐述Go语言闭包在内存占用方面的特点,并且举例说明闭包中的变量如何影响内存占用。
22.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Go语言闭包在内存占用方面的特点

  1. 延长变量生命周期:闭包会使得其内部引用的外部变量的生命周期延长。正常情况下,函数结束时其局部变量会被销毁,但如果局部变量被闭包引用,这些变量会一直存在,直到闭包不再被使用。例如,在下面代码中x作为外部函数的局部变量,由于被闭包f引用,在f使用完之前不会被销毁。
  2. 额外内存开销:闭包本身也会占用一定的内存空间,用于存储其引用的环境(即外部变量)以及函数体等信息。这意味着相比普通函数,闭包会带来一些额外的内存占用。

闭包中的变量对内存占用影响的示例

package main

import (
    "fmt"
)

func outer() func() int {
    x := 10
    return func() int {
        x++
        return x
    }
}

func main() {
    f := outer()
    fmt.Println(f()) // 输出 11
    fmt.Println(f()) // 输出 12
}

在上述代码中,outer函数返回一个闭包。闭包内部引用了outer函数的局部变量x。每次调用闭包f时,都会对x进行操作并返回新的值。由于x被闭包引用,它不会随着outer函数的结束而被销毁,从而持续占用内存。如果有多个闭包同时引用相同的外部变量,这些闭包共享对该变量的引用,不会重复创建变量实例,但会增加对该变量内存空间的引用计数,只有当所有引用该变量的闭包都不再使用时,该变量占用的内存才会被释放。