我正在阅读一本(非常好的)围棋书并看到了这个例子,但我不明白它是如何工作的。
func makeEvenGenerator() func() uint {
i := uint(0)
return func() (ret uint) {
ret = i
i += 2
return
}
}
func main() {
nextEven := makeEvenGenerator()
fmt.Println(nextEven()) // 0
fmt.Println(nextEven()) // 2
fmt.Println(nextEven()) // 4
}
递增i
是常见的关闭行为。没关系。但是如果你看一下nextEven
,它是一个不带参数并返回一个uint
被调用的函数ret
。但是命名返回值有什么意义呢?任何调用它的代码都不会使用自己的变量名吗?
return 语句什么也不返回 - 那么打印的是什么?0 / 2 / 4 是如何从这个函数中出来的?
这与这样做有什么不同:
func makeEvenGenerator() func() uint {
i := uint(0)
return func() uint {
current := i
i += 2
return current
}
}
这似乎更简单,并使事情变得更加明显。我是否缺少一些深入的围棋/数学概念?