闭包(Closure)是指一个函数与其相关的引用环境组合而成的实体,它可以捕获外部变量,并可以在函数执行过程中修改或访问这些变量。在Go语言中,闭包提供了一种简单而强大的方式来封装函数和它们的状态。这种状态通常被称为捕获变量(Captured Variable)。
闭包的定义如下:
func foo() func() int {
sum := 0
return func() int {
sum++
return sum
}
}
例如,我们定义了一个名为foo的函数,它返回了一个新的匿名函数。这个新函数有一个局部变量sum,该变量的初始值为0。每当新函数被调用时,它都会将sum的值加1,然后返回新的sum值。在每次调用之间,sum的值保持不变。
现在,我们可以在任何位置使用foo函数来获得这个新函数,并使用它来计算序列中的下一个数,如下所示:
f := foo()
for i := 1; i <= 10; i++ {
fmt.Println(f())
}
// Output: 1 2 3 4 5 6 7 8 9 10
在这个例子中,我们首先将foo函数赋值给变量f。然后,我们使用循环来调用f函数10次,并打印每次返回的值。
可以看到,每次调用f函数时,它都会返回一个递增的数字,这表明sum的值在函数调用之间得到了保留,并且新函数可以访问和修改该值。这就是闭包的工作原理。