理解golang中的词法范围

时间:2016-06-14 09:32:37

标签: 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()

有没有更好的方法可能会丢失?

1 个答案:

答案 0 :(得分:4)

  

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

这是预期的,您的解决方法是可以的。它在Effective Go中有详细描述。

  

:=声明中,即使变量v已经存在,也可能出现变量v   已经宣布,提供:

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