理解 golang 中的词法范围

Understanding lexical scoping in golang

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

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

我的理解是 := 运算符创建未定义的变量,因此只有 err 必须定义。但是,这种理解显然是错误的。

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

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

var err error
X, err = InitX()

有没有更好的方法我可能会错过?

My understanding is that the := operator creates variables which are not defined and hence, only err has to get defined.

这是预料之中的,您的解决方法没问题。 Effective Go.

中对其进行了详细描述

In a := declaration a variable v may appear even if it has already been declared, provided:

  • this declaration is in the same scope as the existing declaration of v (if v is already declared in an outer scope, the declaration will create a new variable §),
  • the corresponding value in the initialization is assignable to v, and
  • there is at least one other variable in the declaration that is being declared anew.