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

Ste*_*ose 13 scope declaration go

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

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

当使用'='时,第二个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
}
Run Code Online (Sandbox Code Playgroud)

要么

globalVar := "string"
var err error
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否必须使用其中一种解决方法,或者是否有正确的方法来实现我的需求?

第二个解决方案看起来最简单,但是如果在if-scope中只需要很多变量,那么这些变量将不会在作用域之后被删除并持久化整个外部作用域.所以在我看来,第一个解决方案似乎是最好的.

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

Kam*_*iel 14

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

var (
    globalVar string
    err error
)

globalVar = "string"
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}
Run Code Online (Sandbox Code Playgroud)

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

globalVar := "string"
if globalVar == "string" {
    var err error
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/73bF_tHYsC示例与上一个答案类似.

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