Function 需要更多关于Go函数闭包的评论吗
下面是《围棋之旅》中函数闭包的代码,我对函数闭包略知一二,但我是围棋的初学者Function 需要更多关于Go函数闭包的评论吗,function,go,closures,Function,Go,Closures,下面是《围棋之旅》中函数闭包的代码,我对函数闭包略知一二,但我是围棋的初学者 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
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),
)
}
}
主程序包
输入“fmt”
func加法器()func(int)int{
总和:=0
返回func(x int)int{
总和+=x
回报金额
}
}
func main(){
pos,neg:=加法器(),加法器()
对于i:=0;i<10;i++{
fmt.Println(
职位(i),
负(-2*i),
)
}
}
以下是问题:
func adder()func(int)int{
分别是什么[参数列表]和[返回类型]pos,neg:=adder(),adder()
,是否意味着要将函数adder分配给pos和neg,为什么不应该是pos,neg:=adder,adder
Q:for
func adder()func(int)int{
什么是[参数列表]和[返回类型]?
答:在这里,我们有一个名为adder()
的函数,它不接受返回函数func(int)int
的参数,该函数接受一个整数并返回一个整数
Q:对于问题1的同一行,为什么会有(int)
,而不是像(x int)
?
答:这是加法器()
函数
func加法器()func(int)int{
总和:=0
返回func(x int)int{
总和+=x
回报金额
}
}
看一看正在返回的函数,这里func(x int)int
已经有一个命名参数(x
),所以我们不需要在func adder()func(int)int
中再次提及它,因为如果我们执行类似func adder()func(x int)int
的操作,这里的x
就没有任何用处了
因此,如果返回的函数有两个参数(一个额外的参数是字符串类型),那么它看起来像以下代码:
func adder()func(int,string)int{
总和:=0
返回func(x int,y string)int{
总和+=x
fmt.Println(y)
回报金额
}
}
注意,我们在func adder()func(int,string)int{
添加了string
类型,这是因为我们返回的函数采用string
类型
Q:对于pos,neg:=adder(),adder(),这是否意味着要将函数adder分配给pos和neg,为什么不应该是pos,neg:=adder,adder?
A:看,当我们将pos
赋值给adder()
(pos:=adder()
)时,pos
成为一个新函数,因为adder()
返回了一个函数func(int)int
,因此我们可以执行pos(i)
对于neg
Q:forfunc adder()func(int)int{
什么是[参数列表]和[返回类型]?
答:在这里,我们有一个名为adder()
的函数,它不接受返回函数func(int)int
的参数,该函数接受一个整数并返回一个整数
Q:对于问题1的同一行,为什么会有(int)
,而不是像(x int)
?
答:这是加法器()
函数
func加法器()func(int)int{
总和:=0
返回func(x int)int{
总和+=x
回报金额
}
}
看一看正在返回的函数,这里func(x int)int
已经有一个命名参数(x
),所以我们不需要在func adder()func(int)int
中再次提及它,因为如果我们执行类似func adder()func(x int)int
的操作,这里的x
就没有任何用处了
因此,如果返回的函数有两个参数(一个额外的参数是字符串类型),那么它看起来像以下代码:
func adder()func(int,string)int{
总和:=0
返回func(x int,y string)int{
总和+=x
fmt.Println(y)
回报金额
}
}
注意,我们在func adder()func(int,string)int{
添加了string
类型,这是因为我们返回的函数采用string
类型
Q:对于pos,neg:=adder(),adder(),这是否意味着要将函数adder分配给pos和neg,为什么不应该是pos,neg:=adder,adder?
A:看,当我们将pos
赋值给adder()
(pos:=adder()
)时,pos
成为一个新函数,因为adder()
返回了一个函数func(int)int
,因此我们可以执行pos(i)
同样适用于neg