Go的闭包是什么?如何定义? 代码示范

4 min read

闭包(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的值在函数调用之间得到了保留,并且新函数可以访问和修改该值。这就是闭包的工作原理。