我是Go的新手,正在学习该语言的基础知识。这就是我被困住的地方。
我从基础课程中了解到,var x int = 10
和x := 10
应该是等价的,后者是速记符号。 在这两个在main()函数中之前,这一切都是有意义的。
这意味着:
package main
import "fmt"
func main() {
var x int = 20
fmt.Println(x)
}
,
func main() {
var x := 20
fmt.Println(x)
}
和
func main() {
x := 20
fmt.Println(x)
}
所有这些都运行良好。 但是当我将此变量移到 main 函数之外时,行为是不同的,我在可以找到的教程中找不到解释。
这意味着,
package main
import "fmt"
var x int = 20
func main() {
fmt.Println(x)
}
和
var x = 20
func main() {
fmt.Println(x)
}
按预期运行,但是,
x := 20
func main() {
fmt.Println(x)
}
给出一个错误:
语法错误:函数体外部的非声明语句
为什么这个语句变成了"非声明"语句,它与 main() 函数中使用的相同语法有何不同?
Go 的设计者选择不允许在函数之外使用这种速记。围棋的人在这里暗示了他们的理由
在函数内部,可以使用 := 短赋值语句代替隐式类型的 var 声明。
在函数外部,每个语句都以关键字(var、func 等)开头,因此 := 构造不可用。
设计师更喜欢顶层的每个语句都以关键字开头。也许是为了美学。也许是为了便于解析。也许是因为顶级的东西是你可以出口的东西,如果你大写。
这种结构既称为短赋值语句(在 Go Tour 中),又正式地在语法中称为短变量声明!鉴于它正式是一个声明,正如您所暗示的那样,错误消息恕我直言是错误的!他们可以做得更好。他们应该说"在功能之外发现简短声明"。
更新
这个问题看起来像一个骗局:为什么在 Go 中不允许在包级别进行短变量声明?
但是,如果问题不是"为什么不允许?"而是"为什么错误消息说它是非声明?"那么这是一个很好的,独特的问题。