为何在循环调用中,sum只被初始化了一次?
来源:2-2 函数式编程例一
AT路遥
2021-12-27 15:53:17
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),
)
}
}其中:
sum := 0
return func(x int) int {
sum += x
return sum
}匿名函数引用外部变量,形成闭包.sum是有记忆功能的.可是在函数adder()中
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}sum,是函数的内部变量,在循环中累次调用adder()函数.不应该是每调用一次,sum就被初始化一次么?这样就不能实现累加了.
按照程序运行的结果看,实现了累加,在循环调用中,sum并没有每次都被初始化.这是为什么?是go语言的语法规则么?我在课程中并没有听到类似的规则.
1回答
ccmouse
2021-12-28
adder函数只调用了2次,在pos, neg := adder(), adder()
所以sum只被初始化两次,一次用来累加正数,一次用来累加负数。
后面我们循环调用的是pos, neg函数,不是adder函数。
pos, neg函数的函数体是:
sum += xreturnsum
没有初始化sum。“匿名函数引用外部变量,形成闭包.sum是有记忆功能的。”这句话说的是对的。其中“记忆功能”并不特殊,每个变量只要没有初始化都有“记忆功能”。
相似问题