在 Go 中,以干净简洁的方式处理多个错误可能是一个挑战。考虑以下代码片段:
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 }
此代码有几个问题。首先,它使用多个 if 语句来单独处理每个错误。这使得代码冗长且难以阅读。其次,它返回遇到的第一个错误,这可能不是最重要或最相关的错误。
Go 中有一种更好的方法使用函数闭包来处理多个错误。下面是使用函数闭包的代码修订版本:
var err error f := func(dest *D, src S) bool { *dest, err = json.Marshal(src) return err == nil } f(&aJson, a) && f(&bJson, b) && f(&cJson, c) && f(&dJson, d) && f(&eJson, e) && f(&fJson, f) && f(&gJson, g) return err
此代码定义了一个函数闭包 (f),它采用两个参数:指向目标变量的指针和源值。闭包尝试将源值编组到目标变量中,如果不成功则设置错误。
然后为每个源值调用函数闭包,并使用 && 运算符组合结果。如果任何函数闭包返回错误,则整体 err 变量将被相应设置。否则,err 变量将为 nil。
这段代码比原始代码更干净、更简洁。它还可以一次性处理所有错误,从而更容易识别最重要的错误。
以上是如何优雅地处理 Go 中的多个错误?的详细内容。更多信息请关注PHP中文网其他相关文章!