理解 golang 中的词法范围

Ven*_*kat 2 go lexical-scope

https://play.golang.org/p/kK9c71Yt9N - 这是我正在使用的代码。

我试图了解变量的词法范围X。如果我使用第:=11 行中的运算符,则X定义在外的func main会被隐藏,并且会在函数内创建一个新的作用域。如果我=在同一行中使用运算符,编译器会抱怨err未定义。

我的理解是:=操作员创建了未定义的变量,因此只err需要定义即可。但是,这种理解显然是错误的。

我可以做哪些代码更改以确保X不在 内重新定义main()

我知道我可以执行以下操作以确保X不会在 内重新定义main()

var err error
X, err = InitX()
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法可以让我失踪?

cni*_*tar 5

我的理解是 := 运算符创建了未定义的变量,因此,只有 err 必须被定义。

这是意料之中的,您的解决方法没问题。在Effective Go中有详细的描述。

:=声明中,即使已经声明了变量 v 也可能出现,前提是:

  • 此声明与 v 的现有声明在同一范围内(如果 v 已在外部范围中声明,则该声明将创建一个新变量§),
  • 初始化中的相应值可分配给 v,并且
  • 声明中至少有一个其他变量正在重新声明。