Go语言中的闭包

发布时间 2023-09-07 14:12:23作者: tangjicheng

在 Go 语言中,匿名函数和闭包是两个相关但略有区别的概念:

  1. 匿名函数:如其名,是没有名字的函数。你可以将它赋值给变量或直接调用它。

    func() {
        fmt.Println("I'm an anonymous function!")
    }()
    
  2. 闭包:是一个函数值,它引用了外部作用域中的变量。该函数可以访问并分配给引用的变量的值,换句话说,该函数“绑定”在这些变量上。

现在,关于变量捕获的部分:

在 Go 中,当闭包(也就是匿名函数)捕获其外部作用域的变量时,它捕获的是这些变量的引用,而不是它们的值。这意味着如果闭包修改了一个捕获的变量的值,那么这个变量的实际值也会被改变。

例如:

func main() {
    x := 10
    increment := func() {
        x++
        fmt.Println(x)
    }
    increment()  // 输出 11
    fmt.Println(x)  // 输出 11, x 的值被闭包修改了
}

在上面的代码中,闭包 increment 捕获了变量 x 的引用。当闭包增加 x 的值时,x 的实际值也随之增加。

因此,要特别注意闭包和捕获的变量的交互,以避免可能出现的副作用。