跳转至

Go 函数值与闭包

约 131 个字 54 行代码 预计阅读时间 1 分钟

函数值形式

作为数据类型

func(参数类型) 返回值类型

作为值

1
2
3
func(参数类型) 返回值类型{
    ...
}

闭包

是函数值,它引用了其函数体之外的变量。

该函数可以访问并赋予其引用的变量的值,换句话说,该函数被这些变量“绑定”在一起。

package main
import "fmt"
func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}
func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

函数adder返回一个闭包。每个闭包都被绑定在其各自的sum变量上。

练习:斐波那契闭包

package main
import "fmt"
// 返回一个“返回int的函数”
func fibonacci() func() int {
    sum_o := 0
    sum := 0
    temp := 0
    i := 0
    return func() int {
        if sum == 0 && sum_o == 0 {
            sum = 1
            return 0
        } else if sum_o == 0 {
            i += 1
            if i >= 2 {
                sum_o = 1
            }
            return 1
        } else {
            temp = sum
            sum += sum_o
            sum_o = temp
            return sum
        }
    }
}
func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

来源

https://tour.go-zh.org/moretypes/26