MST

星途 面试题库

面试题:Go闭包中变量作用域与生命周期问题

在Go语言中,假设有如下代码:func outer() func() { var num int = 10 return func() { num++ return num } } 当我们多次调用outer()返回的闭包函数时,每次得到的结果是独立的还是共享的?请解释其中变量num的作用域和生命周期。
44.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 结果独立性分析
    • 每次调用outer()返回的闭包函数,得到的结果是独立的。因为每次调用outer()函数,都会在其函数内部创建一个新的num变量。
  2. 变量num的作用域
    • num的作用域是outer函数内部以及其返回的闭包函数内部。在outer函数外部无法直接访问num变量。
  3. 变量num的生命周期
    • num变量的生命周期从outer函数被调用开始,到outer函数返回的闭包函数不再被引用时结束。由于闭包可以“捕获”并持有其外部函数的变量,只要闭包函数还存在,num变量就会一直存在于内存中,不会因为outer函数执行完毕而被销毁。例如:
package main

import "fmt"

func outer() func() {
    var num int = 10
    return func() {
        num++
        return num
    }
}

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

在上述代码中,f1f2是两次调用outer返回的不同闭包,它们分别维护自己独立的num变量。