В чем разница между короткими и длинными объявлениями переменных в Go?

Из моего прочтения спецификации:

A short variable declaration... is a shorthand for a regular variable declaration with initializer expressions but no types...

http://golang.org/ref/spec

Я бы подумал, что они идентичны:

var f func()
f = func() {
   ...
}

и

f := func() {
   ...
}

Но похоже, что это не так. Я пытался обернуть само-рекурсивную функцию внутрь внешней функции, но это работает:

func myOuter() {
    var f func()

    f = func() {
        f()
    }

    f()
}

Но это не так, говоря undefined: fво внутренней функции.

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

    f()
}

Так в чем же разница? Есть ли способ написать это с помощью краткой декларации формы -или мне нужно написать ее длинной -рукой?

15
задан Joe 8 July 2012 в 13:41
поделиться