在 Go 中优雅地处理多个错误
在 Go 中,经常需要一次处理多个错误,尤其是在处理 I/O 时操作或数据转换。虽然单独检查每个错误的传统方法可能是乏味且重复的,但 Go 提供了一种在一个简洁的块中处理所有错误的机制。
问题:处理多个错误
考虑以下尝试将多个值编组为 JSON 的代码:
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 }
此代码容易出错并且需要对每个编组操作进行重复的错误处理检查。它还使得处理所有 JSON 对象的错误变得具有挑战性。
解决方案:使用非局部变量进行错误检测
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 变量在函数外部声明,允许在对 f 函数的所有调用之间共享它。
f 函数采用指向目标 JSON 对象和源数据的指针。它返回一个布尔值,指示编组是否成功(没有发生错误)。
之后,我们为每个对象调用 f 函数,并用 && (逻辑与)连接结果。如果任何调用返回 false(发生错误),链就会中断,并且 err 变量包含第一个遇到的错误。否则,如果所有调用都返回 true,则没有错误发生,最终 err 为 nil。
在最后一行,我们返回 err 变量,它保存第一个遇到的错误,如果所有操作都成功,则返回 nil .
这种方法允许我们在一条语句中处理所有错误,使错误处理更加简洁和高效。
以上是Go 如何高效处理单个块中的多个错误?的详细内容。更多信息请关注PHP中文网其他相关文章!