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

有没有办法清理这个(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

具体来说,我说的是错误处理。能够一次性处理所有错误会很好。


慕森王
浏览 204回答 3
3回答

慕尼黑8549860

var err errorf := 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

烙印99

将结果放在切片中而不是变量中,将初始值放在另一个切片中进行迭代,如果出现错误则在迭代过程中返回。var result [][]bytefor _, 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    }}当然,这需要类型断言才能使用结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go