根据我对规范的阅读:
A short variable declaration ... is a shorthand for a regular variable declaration with initializer expressions but no types...
我还以为两者是一样的:
var f func()
f = func() {
...
}
和
f := func() {
...
}
但似乎他们不是。我试图在外部函数中包装一个自递归函数,但这有效:
func myOuter() {
var f func()
f = func() {
f()
}
f()
}
但这没有,在内部函数中说 undefined: f
。
func myOuter() {
f := func() {
f()
}
f()
}
那么有什么区别呢? 有没有办法用简短的声明来写这个,或者我必须把它写出来?
最佳答案
f := func() {/* ... */}
等同于 var f func() = func() {/* ... */}
(但在包级别只允许后一个)。在您的特定情况下,这两种变体都不起作用,因为该语句将从右到左进行评估。解决方案是 - 正如您已经建议的那样 - 将语句分成两部分。一个用于声明变量,另一个用于为其分配递归函数。
关于recursion - Go 中的短变量声明和长变量声明之间的闭包范围区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382846/