如果在主函数体之外编写,GoLang 中的 "var deckSize = 20" 和 "deckSize := 20" 有什么区别?

  • 本文关键字:deckSize 区别 var 如果 函数体 中的 GoLang go
  • 更新时间 :
  • 英文 :


我是Go的新手,正在学习该语言的基础知识。这就是我被困住的地方。

我从基础课程中了解到,var x int = 10x := 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 中不允许在包级别进行短变量声明?

但是,如果问题不是"为什么不允许?"而是"为什么错误消息说它是非声明?"那么这是一个很好的,独特的问题。

最新更新