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

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

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

    最佳答案

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

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

    关于Go:声明一个新变量并覆盖来自更高范围的变量,如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17110268/

    10-14 15:39
    查看更多