为何在循环调用中,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是有记忆功能的。”这句话说的是对的。其中“记忆功能”并不特殊,每个变量只要没有初始化都有“记忆功能”。

0
hcmouse
回复
hT路遥
hp>把匿名函数当成一个普通的像int, string那样的变量就好理解了。调用了两次adder函数,所以sum被初始化了两次,两个sum互不相干。

h022-01-16
共2条回复

0 学习 · 1399 问题

查看课程