15

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

// 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 中,这些变量不会在作用域之后被移除,并且会保留整个外部作用域。所以我认为第一个解决方案似乎是最好的。

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

4

1 回答 1

18

只是不要在这种情况下使用 := 并预先声明 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的示例类似于上一个答案。

当您想在一个语句中声明和分配时, := 是一种方便。如果它妨碍了就不要使用它。

于 2013-06-14T16:10:30.263 回答