前往:声明一个新变量并从更高范围覆盖一个变量,如何?

史蒂文·罗斯(Steven Roose):

我在任何地方都找不到答案,所以是这种情况:

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar, err := doSomethingWithString()
    if err != nil {
        // error handling
    }
}

第二个globalVar声明在当时:=和使用'='时均给出错误

  • 有了:=它说,globalVar declared and not used因为现在globalVar是在内部范围内的新变量。
  • =它说undefined err是因为它尚未被声明。

因此,基本上,应该有一种方法来定义之间的差别=:=有关声明的左侧每个变量。

我看到了两种可能的解决方案,在我看来,这两种解决方案都同样难看:

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar2, err := doSomethingWithString()
    if err != nil {
        // error handling
    }
    globalVar = globalVar2
}

要么

globalVar := "string"
var err error
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

我是否必须使用这些变通办法之一,或者是否有实现我所需要的正确方法?

第二种解决方案看起来最难看,但是如果在if-scope中只需要许多变量,这些变量将不会在作用域之后被删除并保留整个外部作用域。因此,我认为最好的解决方案是最好的。

但我想听听其他人如何解决这种情况...

卡米尔·基西尔(Kamil Kisiel):

只是在这种情况下不要使用:=并预先声明globalVar和err。

var (
    globalVar string
    err error
)

globalVar = "string"
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

或者,如果您想限制err的范围,请执行以下操作:

globalVar := "string"
if globalVar == "string" {
    var err error
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

http://play.golang.org/p/73bF_tHYsC,该示例类似于先前的答案。

:=是为了方便您在一个语句中声明和分配。如果遇到问题,请不要使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章