有人可以解释os.Exit()
和panic()
之间的主要区别以及它们在Go中的使用方式吗?
答案 0 :(得分:70)
首先,os.Exit()
可用于正常退出程序而不会出现错误,并且不会发生恐慌,因此这是一个关键的区别。另一个问题是使用recover
可以捕获并忽略或记录恐慌。
但如果我们在谈论错误的退出代码,请说:
当出现可怕的错误时使用panic
,可能是程序员错误,应该在投入生产之前被捕获。这就是它打印堆栈的原因。
如果您愿意,请使用os.Exit(errorCode)
或类似内容:
为脚本目的控制程序的退出代码。
希望有序退出预期的错误(例如用户输入错误)。
所以基本上恐慌是给你的,一个糟糕的退出代码是给你的用户。
答案 1 :(得分:65)
首先,每当你有“如何在实践中使用”这个问题时,一个好的方法就是search Go源代码(或任何足够大的Go代码库,真的),以及package docs获得答案。
现在,os.Exit
和panic
完全不同。当程序或其部分达到不可恢复的状态时,使用panic
。
当调用
panic
时,隐式包含运行时错误,例如将切片索引越界或类型断言失败,它会立即停止执行当前函数并开始展开goroutine的堆栈,沿途运行任何延迟函数。如果那个展开到达goroutine堆栈的顶部,程序就会死掉。
os.Exit
用于需要立即中止程序 而无法恢复或运行延迟清理语句,并返回错误代码(其他程序)可以用来报告发生的事情)。这在测试中很有用,当你已经知道在一次测试失败后,另一次测试也会失败,所以你现在也可以退出。当你的程序完成了它需要做的所有事情时,也可以使用它,现在只需要退出,即在打印帮助信息之后。
大多数情况下,您不会使用panic
(您应该返回error
代替),并且在测试和快速程序的某些情况下,您几乎不需要os.Exit
终止。