问题 Go:声明一个新变量并覆盖更高范围的变量,如何?


我无法在任何地方找到答案,所以情况如下:

// 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中只需要很多变量,那么这些变量将不会在作用域之后被删除并持久化整个外部作用域。所以在我看来,第一个解决方案似乎是最好的。

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


5084
2018-06-14 13:59


起源

在您的第二个解决方法(实际上是正确的),您应该替换 err := errors.New("") 同 var err error。无需创建新的空错误,只需将其设为零。 - ANisus
谢谢,让它变得有点干净了。但这是最“正确”的做法吗? - Steven Roose
:=做它说的,声明并分配给新变量。您希望它充当:=对于部分返回值而对于另一个,根据之前声明的内容。然后,每个:=将进行分析:它是声明和分配还是仅分配?这将是不一致的,imho。 - JimPaek
这就是我想要的。有时你需要两个 = 和 := 功能在一个声明中。据我所知,这是不可能的。 - Steven Roose
这是一个悬而未决的问题,请参阅 Golang问题 可能还有其他合并的问题。似乎没有达成共识如何解决这个问题,或者是否应该完成。 - Gvozden


答案:


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

var (
    globalVar string
    err error
)

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

或者如果你想限制错误的范围:

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

http://play.golang.org/p/73bF_tHYsC 例如,类似于上一个答案。

:=当您想在一个语句中声明和赋值时,这意味着方便。如果它阻碍了就不要使用它。


10
2018-06-14 16:10



最后一个解决方案是我没想到的。这对我来说似乎是最好的。谢谢! - Steven Roose
保护我不要用可能的可重用TCP连接撕掉我的头发!谢谢! - kouton