Go 函数值与闭包
约 131 个字 54 行代码 预计阅读时间 1 分钟
函数值形式
作为数据类型
作为值
闭包
是函数值,它引用了其函数体之外的变量。
该函数可以访问并赋予其引用的变量的值,换句话说,该函数被这些变量“绑定”在一起。
| 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