在线文档  >   Golang练习   >   闭包

Go 支持 匿名函数,这些函数可以形成闭包。
匿名函数在你想要在不需要命名的情况下内联定义函数时很有用。

package main

import "fmt"

// 这个名为 intSeq 的函数返回另一个函数,我们将其匿名定义在 intSeq 函数体中。
// 返回的函数使用闭包结构 捕获 变量 i。
func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

func main() {

    // 我们调用 `intSeq`,并将返回值(一个函数)赋值为 `nextInt`。
    // 这个函数值捕获了它自己的 `i` 值,每次调用 `nextInt` 都会更新 `i` 的值。
    nextInt := intSeq()

    // 通过调用 `nextInt` 几次来查看闭包的效果。
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    // 为了确认状态是特定于该特定函数的,请创建并测试一个新的函数。
    newInts := intSeq()
    fmt.Println(newInts())
}

运行结果如下:

$ go run closures.go
1
2
3
1

我们马上要学习关于函数的最后一个特性:递归。