为了账号安全,请及时绑定邮箱和手机立即绑定

如果没有错误则返回 Golang

如果没有错误则返回 Golang

Go
桃花长相依 2022-01-04 21:13:27
在Golang中,是否可以运行该函数err, value := function()if err == nil {  return value}而不是这样做:err, value := function()if err != nil {  panic(err)}return err如果有,是否有任何时间优势/奖金?这不是非致命错误。我正在尝试将某些内容转换为不同类型,但我不确定应该使用哪种类型。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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


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

}

如果你在这个例子中恐慌,你就大功告成了(试试它——而不是返回一个错误做恐慌(“一些错误”)。但是相反,我们确定有一个错误,我们可以尝试生成另一个随机数字。


就像其他人所说的那样,如果您有一个无法恢复的用例(假设您试图从文件中读取,但文件不在那里),您可能会决定最好恐慌。但是如果你有一个长时间运行的进程(比如一个 API),你会想要继续搅动,尽管有任何错误。


GoPlay 在这里: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))

}

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


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信