如果没有错误则返回Golang

Pet*_*ete 5 error-handling go

在Golang中,运行该函数可以吗

err, value := function()
if err == nil {
  return value
}
Run Code Online (Sandbox Code Playgroud)

而不是这样做:

err, value := function()
if err != nil {
  panic(err)
}
return err
Run Code Online (Sandbox Code Playgroud)

如果是这样,有什么时间优势/奖金吗?

这不是一个非致命错误。我正在尝试将某些内容转换为不同的类型,但我不确定应该使用哪种类型。

wil*_*.09 6

恐慌类似于异常,但不会传递给调用者(也就是当您调用恐慌时,它会立即发生;您无需等待)。您应该使用代码的第一个示例,您可以在其中尝试操作、失败然后继续。

func main() {
    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)

    // Generate some random numbers, and call into add()
    for i := 0; i < 10; i++ {
        s, err := add(r1.Intn(100), r1.Intn(100))
        if err != nil {
            fmt.Println(err)
            continue
        }
        fmt.Println(s)
    }
}

// Error if we get a sum over 100
func add(a int, b int) (int, error) {
    s := a + b
    if s > 100 {
        return s, errors.New("Hey doofus, error!")
    }
    return s, nil
}
Run Code Online (Sandbox Code Playgroud)

如果你在这个例子中感到恐慌,那么你就完成了(尝试一下——而不是返回错误,而是执行恐慌(“Some error”)。相反,我们确定存在错误,并且我们可以尝试生成另一个随机数数字。

就像其他人所说的那样,如果您遇到无法恢复的用例(假设您试图从文件中读取数据,但该文件不存在),您可能会认为最好惊慌。但是,如果您有一个长时间运行的流程(例如 API),您将希望继续搅动,尽管存在任何错误。

在这里玩: http: //play.golang.org/p/ThXTxVfM6R

OP 用一个用例更新了他的帖子——他正在尝试转换为一种类型。如果你在这个函数中惊慌失措,你就会死在水里。相反,我们希望返回一个错误,并让调用者决定如何处理该错误。以此为例:

func interfaceToString(i interface{}) (string, error) {
    if i == nil {
        return "", errors.New("nil interface")
    }

    switch i.(type) {
    case string:
        return i.(string), nil
    case float64:
        return strconv.Itoa(int(i.(float64))), nil
    case int:
        return strconv.Itoa(i.(int)), nil
    }

    return "", errors.New(fmt.Sprintf("Unable to convert %v", i))
}
Run Code Online (Sandbox Code Playgroud)

在这里玩:http://play.golang.org/p/7y7v151EH4