MST

星途 面试题库

面试题:Go语言中闭包的基础概念及简单实现

请解释Go语言中闭包的概念,并通过一个简单的代码示例展示如何在Go中实现闭包。同时说明闭包中变量的生命周期特点。
45.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

闭包概念

在Go语言中,闭包是一个函数值,它可以引用其外部作用域中声明的变量。即使外部函数已经返回,这些变量依然可以被闭包函数访问和修改。闭包允许将函数与其相关的环境(即该函数引用的变量)打包在一起,形成一个独立的单元。

代码示例

package main

import "fmt"

// 外部函数,返回一个闭包函数
func counter() func() int {
    count := 0
    // 闭包函数
    return func() int {
        count++
        return count
    }
}

在上述代码中,counter 函数返回一个匿名函数。这个匿名函数形成了一个闭包,它引用了 counter 函数内部的变量 count。每次调用返回的匿名函数时,count 变量都会自增并返回新的值。

闭包中变量的生命周期特点

  1. 延长生命周期:闭包中的变量生命周期会延长,超出其原始定义的函数作用域。例如上述代码中,count 变量本应在 counter 函数返回时销毁,但由于闭包的存在,只要闭包函数还在被使用,count 变量就会一直存在。
  2. 共享状态:同一个外部函数多次调用返回的闭包,共享外部函数中定义的变量。例如:
func main() {
    c1 := counter()
    c2 := counter()
    fmt.Println(c1()) // 输出1
    fmt.Println(c1()) // 输出2
    fmt.Println(c2()) // 输出1,因为c1和c2的count变量是相互独立的
}

每个闭包都有自己独立的状态副本,尽管它们来自同一个外部函数。