为何在循环调用中,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 += x
return
sum
没有初始化sum。“匿名函数引用外部变量,形成闭包.sum是有记忆功能的。”这句话说的是对的。其中“记忆功能”并不特殊,每个变量只要没有初始化都有“记忆功能”。
相似问题