需要更多关于 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),
)
}
}
这里有问题:
- 对于
func adder() func(int) int {
,[参数列表]和[return_types]分别是什么?
- 与问题1同一行,为什么有(int),而不是(x int)?
- for
pos, neg := adder(), adder()
,是否意味着将函数adder赋值给pos和neg,为什么不应该是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
也是如此。
下面是围棋之旅中函数闭包的代码,我对函数闭包略知一二,但我是初学者围棋
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),
)
}
}
这里有问题:
- 对于
func adder() func(int) int {
,[参数列表]和[return_types]分别是什么? - 与问题1同一行,为什么有(int),而不是(x int)?
- for
pos, neg := adder(), adder()
,是否意味着将函数adder赋值给pos和neg,为什么不应该是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
也是如此。