https://play.golang.org/p/kK9c71Yt9N - 这是我正在处理的代码。
我正在尝试理解变量X
的词法范围。如果我在第11行使用:=
运算符,X
之外定义的func main
会被隐藏,并且会在函数中创建新范围。如果我在同一行中使用=
运算符,编译器会抱怨err
未定义。
我的理解是:=
运算符创建了未定义的变量,因此只需定义err
。但是,这种理解显然是错误的。
我可以采取哪些代码更改,以确保X
内未重新定义main()
?
我知道我可以执行以下操作以确保X
内未重新定义main()
:
var err error
X, err = InitX()
有没有更好的方法可能会丢失?
答案 0 :(得分:4)
我的理解是:=运算符创建了变量 未定义,因此,只有错误必须定义。
这是预期的,您的解决方法是可以的。它在Effective Go中有详细描述。
在
:=
声明中,即使变量v已经存在,也可能出现变量v 已经宣布,提供:
- 此声明与v的现有声明的范围相同 (如果v已在外部范围内声明,则声明将 创建一个新变量§),
- 中的相应值 初始化可分配给v和
- 至少还有一个 声明中的变量正在重新声明。