在 Go 语言中,匿名函数和闭包是两个相关但略有区别的概念:
-
匿名函数:如其名,是没有名字的函数。你可以将它赋值给变量或直接调用它。
func() { fmt.Println("I'm an anonymous function!") }()
-
闭包:是一个函数值,它引用了外部作用域中的变量。该函数可以访问并分配给引用的变量的值,换句话说,该函数“绑定”在这些变量上。
现在,关于变量捕获的部分:
在 Go 中,当闭包(也就是匿名函数)捕获其外部作用域的变量时,它捕获的是这些变量的引用,而不是它们的值。这意味着如果闭包修改了一个捕获的变量的值,那么这个变量的实际值也会被改变。
例如:
func main() {
x := 10
increment := func() {
x++
fmt.Println(x)
}
increment() // 输出 11
fmt.Println(x) // 输出 11, x 的值被闭包修改了
}
在上面的代码中,闭包 increment
捕获了变量 x
的引用。当闭包增加 x
的值时,x
的实际值也随之增加。
因此,要特别注意闭包和捕获的变量的交互,以避免可能出现的副作用。