Go中的短变量声明和长变量声明之间的闭包范围差异是什么?

Joe*_*Joe 15 recursion closures go

从我阅读规范:

短变量声明...是使用初始化表达式但没有类型的常规变量声明的简写...

http://golang.org/ref/spec

我原以为这两个是相同的:

var f func()
f = func() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

f := func() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但似乎他们不是.我试图在外部函数中包装一个自递归函数,但这有效:

func myOuter() {
    var f func()

    f = func() {
        f()
    }

    f()
}
Run Code Online (Sandbox Code Playgroud)

但这不是,undefined: f在内部功能中说.

func myOuter() {
    f := func() {
        f()
    }

    f()
}
Run Code Online (Sandbox Code Playgroud)

那么区别是什么呢?有什么方法可以用简短的声明来写这个,或者我是否必须长篇大论地写出来?

tux*_*21b 14

f := func() { /* ... */ }与...相同var f func() = func() { /* ... */ }(但只允许在包级别使用后一个).在您的特定情况下,这两个变体都不起作用,因为语句将从右到左进行评估.正如您已经建议的那样,解决方案是将语句拆分为两个.一个用于声明变量,另一个用于为其分配递归函数.