`Exit(1)` 在哪里,return 错误在哪里?

Where to `Exit(1)` and where to return error?

处理发生在程序层深处的错误的惯用方法是什么?如果我在包裹深处的某处有这样的片段:

file, err := os.Open(path)
if err != nil {            
    os.Exit(1) // or return errors.New("The path is invalid.")
}                          

我应该 return 一个错误并可能将它拖过几个层 if {} else {} 块到 mainExitmainExit马上?

直接 Exit 代码看起来更清晰、更易读。但有时很难测试。使用 returns 和检查代码看起来更糟(在我看来)但它更容易测试并达到 100% 的覆盖率。

还有一个问题...如果我正在编写一个包并且它没有 main 功能,我应该将 Exit 留给 "user" 程序并且只是 return 错误?

基本上你最好就地处理错误,而不是通过药物来解决。当您需要立即退出时,您也可以调用 os.Exit()。你忘记了另一个选项 - panic()。它遍历并评估延迟函数,允许您进行一些拆解。在编写包时,不建议调用 os.Exit()panic() 以免用户因无法预测而感到困惑。在包中提升错误是最好的选择。