Go闭包

在Go语言中,闭包(closure)是一种函数(function)的特殊形式,它可以捕获其所在环境的变量,并将其变为函数对象的一部分。

简而言之,闭包是一个函数和其相关的引用环境组合而成的实体。

具体来说,闭包可以让一个函数访问其外部函数的局部变量或者全局变量。在Go语言中,闭包通常是通过函数字面量(function literal)来创建的,也就是将函数定义在另一个函数的内部,并返回该函数。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}

func main() {
a := adder()
fmt.Println(a(1)) // 输出 1
fmt.Println(a(2)) // 输出 3
fmt.Println(a(3)) // 输出 6
}

在这个例子中,adder()函数返回了一个函数,这个函数可以访问adder()函数内部的sum变量。每次调用这个返回的函数,它都会将传入的参数加到sum变量上,并返回新的sum值。由于sum变量被包含在闭包中,所以每次调用这个返回的函数时,它都会保留上一次调用的sum值,从而实现了累加器的功能。

闭包在Go语言中有着广泛的应用,尤其是在并发编程中。例如,在使用goroutine时,可以将函数字面量作为goroutine的参数,从而创建一个能够访问其所在环境的闭包。