根据Go参考,有两种声明变量的方法
Variable_declarations(格式为var count = 0或var count int)
和
Short_variable_declarations(格式为count := 0)
我发现决定使用哪一个是非常令人困惑的.
我所知道的差异(到现在为止)是:
count := 0在函数范围内使用格式.count := 0可以  在多变量简短声明中重新声明.但就我所知,他们的行为确实相同.在参考文献中它还说:
它(
count:=0方式)是具有初始化表达式但没有类型的常规变量声明的简写
我的困惑是:
这是允许的:
package main
var a = 3
...
但这不是:
package main
a := 3
...
为什么不?为什么函数外部的短变量声明不能在没有类型的情况下处理常规声明?只是为了简化解析?
来自Java和C#的背景我很高兴Golang能够使用快捷方法对函数内的私有变量进行变量声明,这使我能够编写:
x := 1.5
它让我想起了用Python等动态语言打字的鸭子.但是,在声明函数范围之外的全局变量时,您仍然需要使用更详细的语法:
var x float64 = 1.5
我只是想知道为什么快捷方法适用于私有变量而不是全局变量?我知道这种语言的设计者非常有经验,所以我认为这并不能反映出被忽视的特征.是否存在技术上的原因,为什么这种类型推断(我意识到:=快捷方式与正确的类型推断不同)在全局范围内不起作用?它在设计方面似乎有些不一致,作为一个没有经验的Gopher,我必须承认在某些情况下被这个抛弃了.总的来说,我真的很享受围棋.
Go文档表明应该使用速记:
x := "Hello World" 
而不是长形式
var x string = "Hello World"
提高可读性.虽然以下工作:
package main   
import "fmt"
var x string = "Hello World"
func main() {
    fmt.Println(x)
}
这不是:
package main
import "fmt"
x := "Hello World"
func main() {
    fmt.Println(x)
}
并给出错误"函数体外的非声明语句".相反,我在函数中声明它:
package main
import "fmt"
func main() {
   x := "Hello World"
   fmt.Println(x)
}
然后它工作得很好.看来我只能在使用变量的函数中使用简写.是这样的吗?谁能告诉我为什么?