需要更多关于 Go 函数闭包的评论

Need more comments on Function Closures of Go

下面是围棋之旅函数闭包的代码,我对函数闭包略知一二,但我是初学者围棋

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),
        )
    }
}

这里有问题:

  1. 对于func adder() func(int) int {[参数列表][return_types]分别是什么?
  2. 与问题1同一行,为什么有(int),而不是(x int)
  3. for pos, neg := adder(), adder(),是否意味着将函数adder赋值给posneg,为什么不应该是pos, neg := adder, adder

问:对于func adder() func(int) int {,[参数列表]和[return_types]分别是什么?

A:在这里,我们有一个名为 adder() 的函数,它不接受任何参数,returns 一个函数 func(int) int 接受一个整数,returns 一个整数。

问:与问题1同一行,为什么有(int),而不是(x int)?

答:这是adder()函数

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

看看返回的函数,这里func(x int) int已经有一个命名参数(x),所以我们不需要在[=20=再次提及它],因为如果我们做类似 func adder() func(x int) int 的事情,这里的 x 就没有用了。

因此,如果返回的函数有,比如说,2 个参数(一个额外的是 string 类型),那么它看起来像下面的代码:

func adder() func(int, string) int {
    sum := 0
    return func(x int, y string) int {
        sum += x
        fmt.Println(y)
        return sum
    }
}

请注意,我们在 func adder() func(int, string) int { 处添加了一个 string 类型,这是因为我们返回的函数采用 string 类型。

Q:for pos,neg := adder(),adder(),是不是表示把函数adder赋值给pos和neg,为什么不应该是pos,neg := adder , 加法器?

A:看,当我们将pos分配给adder()pos := adder())时,pos变成了一个新函数,因为adder()返回了一个函数func(int) int,这样我们就可以做到pos(i).

neg也是如此。