英文:
function as a return value, don't understand the output of an example
问题
以下示例打印出12。我不理解这个输出。为什么它打印出12而不是11?
func fA() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
fB := fA()
fmt.Print(fB())
fmt.Print(fB())
}
这段代码定义了一个函数fA
,它返回一个函数类型func() int
。在fA
函数内部,有一个变量i
,初始值为0。返回的函数会使i
的值递增,并返回递增后的值。
在main
函数中,我们首先调用fA
函数并将返回的函数赋值给变量fB
。然后连续两次调用fB
函数并打印其返回值。
由于fB
函数是由fA
函数返回的,它们共享同一个变量i
。每次调用fB
函数时,i
的值都会递增。因此,第一次调用fB
函数时,i
的值变为1,并返回1。第二次调用fB
函数时,i
的值变为2,并返回2。
所以最终的输出是12,而不是11。
英文:
The following example prints 12. I can't understand this output. Why did it print 12 and not 11?
func fA() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
fB := fA()
fmt.Print(fB())
fmt.Print(fB())
}
答案1
得分: 4
这是一个闭包。基本上,返回的函数知道其作用域外定义的变量。因此,当你调用fA()时,返回的函数中的i等于0,当你调用fB()时,它会增加i的值,现在i等于1。当你再次调用它时,它会再次增加i,现在i等于2。如果你使用fA()创建一个新函数,这个新函数将有一个新的i。类似于以下代码:
fB := fA()
fC := fA()
fmt.Print(fB())// 1
fmt.Print(fB())// 2
fmt.Print(fC())// 1
fmt.Print(fB())// 3
更多关于闭包的信息可以参考这里。
英文:
It is a closure. Basically, the function returned knows the variable defined outside its scope, so when you call fA(), the returned function has i = 0, when you call fB(), it increments the value of i, now i = 1. when you call it again it will increment i again, and now you have i = 2. If you create a new function using fA(), this new function will have a new i. Something like this:
fB := fA()
fC := fA()
fmt.Print(fB())// 1
fmt.Print(fB())// 2
fmt.Print(fC())// 1
fmt.Print(fB())// 3
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论