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

Go——优雅地处理多个错误?

Go——优雅地处理多个错误?

Go
慕森王 2021-06-01 17:28:01
有没有办法清理这个(IMO)看起来很可怕的代码?    aJson, err1 := json.Marshal(a)bJson, err2 := json.Marshal(b)cJson, err3 := json.Marshal(c)dJson, err4 := json.Marshal(d)eJson, err5 := json.Marshal(e)fJson, err6 := json.Marshal(f)gJson, err4 := json.Marshal(g)if err1 != nil {    return err1} else if err2 != nil {    return err2} else if err3 != nil {    return err3} else if err4 != nil {    return err4} else if err5 != nil {    return err5} else if err5 != nil {    return err5} else if err6 != nil {    return err6} 具体来说,我说的是错误处理。能够一次性处理所有错误会很好。
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

var err error

f := func(dest *D, src S) bool {

    *dest, err = json.Marshal(src)

    return err == nil

} // EDIT: removed ()


f(&aJson, a) &&

    f(&bJson, b) &&

    f(&cJson, c) &&

    f(&dJson, d) &&

    f(&eJson, e) &&

    f(&fJson, f) &&

    f(&gJson, g)

return err


查看完整回答
反对 回复 2021-06-07
?
烙印99

TA贡献1829条经验 获得超13个赞

将结果放在切片中而不是变量中,将初始值放在另一个切片中进行迭代,如果出现错误则在迭代过程中返回。


var result [][]byte

for _, item := range []interface{}{a, b, c, d, e, f, g} {

    res, err := json.Marshal(item)

    if err != nil {

        return err

    }

    result = append(result, res)

}

你甚至可以重用一个数组而不是两个切片。


var values, err = [...]interface{}{a, b, c, d, e, f, g}, error(nil)

for i, item := range values {

    if values[i], err = json.Marshal(item); err != nil {

        return err

    }

}

当然,这需要类型断言才能使用结果。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

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