首页 > 代码库 > Go by Example: Closures

Go by Example: Closures

Go语言支持匿名函数。匿名函数可以组成函数闭包。当你想定义一个不需要命名的内联函数时,匿名函数是非常有用的。

package main

import "fmt"

// 这个"intSeq"函数返回另外一个在intSeq内部定义的匿名函数,
// 这个返回的匿名函数包住了变量i,从而形成了一个闭包
func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main() {
    // 我们调用intSeq函数,并且把结果<span style="font-family: Arial, Helvetica, sans-serif;">(函数)</span><span style="font-family: Arial, Helvetica, sans-serif;">赋值给一个函数nextInt,</span>    // 这个nextInt函数拥有自己的i变量,这个变量每次调用都被更新。
    // 这里i的初始值是由intSeq调用的时候决定的。
    nextInt := intSeq()

    // 调用几次nextInt,看看闭包的效果
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    // 为了确认闭包的状态是独立于intSeq函数的,再创建一个。
    newInts := intSeq()
    fmt.Println(newInts())
}
输出
<strong>$ go run closures.go
1
2
3
1</strong>

下一个章节,我们将学习函数的最后一个特性:递归。

下一个例子:Go by Example:Recursion。

英文原文


Go by Example: Closures