什么时候在Golang中使用os.Exit()和panic()?

有人可以解释os.Exit()panic()之间的关键差异,以及它们在Golang中如何用于实践?

首先,每当你有一个“如何在实践中使用”的问题,一个好的开始就是search Go源代码(或者任何足够大的Go代码库),以及包文档的答案。

现在, os.Exitpanic是完全不同的。 当程序或其部分达到不可恢复的状态时使用panic

当调用panic ,包括隐式地运行时错误,例如索引切片越界或失败types断言,它立即停止当前函数的执行,并开始展开goroutine的堆栈,沿途运行任何延迟的函数。 如果展开到达goroutine堆栈的顶部,程序就会死亡。

os.Exit用于需要立即中止程序不可能恢复或运行延迟清理语句,并返回错误代码(其他程序可用于报告发生的事情)。 这在testing中很有用,当你已经知道在这个testing失败之后,另一个也会失败,所以你不妨现在退出。 当你的程序完成了所有需要做的事情时,这也可以使用,现在只需要退出,即在打印帮助信息之后。

大多数情况下,你不会使用panic (你应该返回一个error ),而且在testing和快速程序终止之外,几乎不需要os.Exit

首先, os.Exit()可以用来正常退出程序而不会出现错误,而且恐慌不会,所以这是一个关键的区别。 另一个是可以捕捉并忽略或logging使用recover恐慌。

但是,如果我们谈论的是一个错误的退出码,让我们说:

当出现可怕的错误时使用panic ,可能是程序员在生产之前应该被捕获的错误。 这就是它打印堆栈的原因。

使用os.Exit(errorCode)或类似的东西,如果你想:

  1. 控制程序的退出代码以用于脚本目的。

  2. 想要一个预期的错误(例如,用户input错误)有序退出。

所以基本恐慌是给你的,一个糟糕的退出代码是为你的用户。