Go:错误变量重新分配,正确使用?

时间:2014-07-27 14:10:32

标签: go

我很担心将err变量重新分配给Go中的错误。

例如,我倾向于这样做:

err1 := Something()
checkErr(err1)
str, err2 := SomethingElse()
checkErr(err2)
err3 := SomethingAgain()
checkErr(err3)

但是我总是忘记这一点,并且有数以百万计的无用的错误变量在我不需要的地方浮动,这会使代码变得混乱和混乱。

但是如果我这样做的话:

err := Something()
checkErr(err)
str, err := SomethingElse()
checkErr(err)
err := SomethingAgain()
checkErr(err)

......它生气并说err已经分配。

但如果我这样做:

var err error
err = Something()
checkErr(err)
str, err = SomethingElse()
checkErr(err)
err = SomethingAgain()
checkErr(err)

...它不起作用,因为需要str分配:=

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

你几乎就在那里......在:=的左侧,至少需要一个新创建的变量。但是如果你没有提前声明err,编译器会尝试在:=的每个实例上创建它,这就是你得到第一个错误的原因。所以这可行,例如:

package main

import "fmt"

func foo() (string, error) {
 return "Bar", nil
}

func main() {
   var err error

   s1, err := foo()
   s2, err := foo()

   fmt.Println(s1,s2,err)
}

或在你的情况下:

//we declare it first
var err error

//this is a normal assignment
err = Something()
checkErr(err)

// here, the compiler knows that only str is a newly declared variable  
str, err := SomethingElse()
checkErr(err)

// and again...
err = SomethingAgain()
checkErr(err)