理解 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.
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.