MST

星途 面试题库

面试题:Go匿名函数的闭包特性

请举例说明Go语言中匿名函数的闭包特性,在闭包环境下,内部函数对外部变量的引用会有怎样的表现?并解释原因。
48.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

匿名函数闭包特性示例

package main

import "fmt"

func main() {
    outerVar := 10
    innerFunc := func() {
        fmt.Println(outerVar)
    }
    innerFunc()
}

在上述代码中,innerFunc 是一个匿名函数,它定义在 main 函数内部,并引用了 main 函数中的变量 outerVar。这就形成了闭包。

闭包环境下内部函数对外部变量引用的表现

  1. 可以访问外部变量:内部函数能够访问并使用外部函数作用域中的变量,如上述代码中 innerFunc 可以打印 outerVar 的值。
  2. 外部变量生命周期延长:即使外部函数执行完毕,只要闭包函数(内部函数)仍然存在,外部变量就不会被销毁。例如:
package main

import "fmt"

func outer() func() {
    outerVar := 10
    innerFunc := func() {
        fmt.Println(outerVar)
    }
    return innerFunc
}

func main() {
    result := outer()
    result()
}

在这个例子中,outer 函数返回了 innerFunc。当 outer 函数执行结束后,outerVar 由于被 innerFunc 引用,其生命周期延长,innerFunc 仍然可以访问并打印 outerVar 的值。

原因解释

闭包会将其引用的外部变量和函数体打包成一个整体,这个整体称为闭包。闭包不仅仅是函数代码,还包含了函数执行所需的环境(即对外部变量的引用)。所以,内部函数在执行时,能够访问到定义它时所在的环境中的变量,即使外部函数的栈帧已经被销毁,这些变量也会因为闭包的引用而继续存在于内存中。