可能有人解释之间的关键差异os.Exit()
,并panic()
和它们是如何在实践中去使用?
panic
是内置的。它的建议(视情况)使用类似os.Exit
,log.Fatal
等等,这将返回错误代码操作系统(总是建议如果可能的话)。这些都涉及导入包,从而“整理”示例代码。示例代码应始终仅用于说明特定问题的解决方案。该代码可能还存在其他问题,如果正确演示,它们会使代码变得更加复杂,因此有损于给出答案的解释。YMMV。
可能有人解释之间的关键差异os.Exit()
,并panic()
和它们是如何在实践中去使用?
panic
是内置的。它的建议(视情况)使用类似os.Exit
,log.Fatal
等等,这将返回错误代码操作系统(总是建议如果可能的话)。这些都涉及导入包,从而“整理”示例代码。示例代码应始终仅用于说明特定问题的解决方案。该代码可能还存在其他问题,如果正确演示,它们会使代码变得更加复杂,因此有损于给出答案的解释。YMMV。
Answers:
首先,每当您遇到“如何在实践中使用它”问题时,一个好的开始方法就是搜索 Go源代码(或实际上足够大的Go代码库),并在软件包文档中寻找答案。
现在,os.Exit
和panic
有很大的不同。panic
当程序或其部分达到不可恢复的状态时使用。
当
panic
被调用时(包括对运行时错误的隐式调用,例如,对切片进行索引编制索引或失败类型声明),它将立即停止当前函数的执行并开始展开goroutine的堆栈,并在此过程中运行所有延迟函数。如果解散到达goroutine堆栈的顶部,程序将终止。
os.Exit
当您需要立即中止程序,无法恢复或运行延迟的清除语句,并且还返回错误代码(其他程序可以用来报告发生的情况)时,使用。这在测试中很有用,当您已经知道一个测试失败后,另一个测试也会失败,因此您最好立即退出。当您的程序完成了它需要做的所有事情后,现在只需要退出,即在打印帮助消息之后,也可以使用此方法。
大多数情况下,您将不使用panic
(应返回一个error
替代值),并且几乎不需要os.Exit
在某些情况下进行测试和快速终止程序。
exit
在这种情况下使用,我只是期望
首先,os.Exit()
可以用来正常退出程序而不会出现错误,而不必惊慌,所以这是一个关键的区别。另一个是可以使用捕获并忽略或记录恐慌recover
。
但是,如果我们谈论的是错误的退出代码,可以这样说:
使用panic
当出现可怕的错误,或许应该才去生产已陷入一个程序员的错误。这就是为什么它打印堆栈的原因。
os.Exit(errorCode)
如果需要,请使用或类似的方法:
为脚本目的控制程序的退出代码。
希望在预期的错误(例如,用户输入错误)上有序退出。
因此,基本上来说,您感到恐慌,而错误的退出代码则对您的用户而言。
关键区别在于:
os.Exit
跳过延迟功能的执行。os.Exit
,您可以指定退出代码。panic
终止而os.Exit
并非终止。(似乎其他答案没有提及。)如果您需要执行延迟功能,则别无选择panic
。(另一方面,如果要跳过延迟功能的执行,请使用os.Exit
。)
如果以这种方式定义了非无效函数:
return
或终止panic
然后,您将无法替换为panic
,os.Exit
否则编译器将拒绝编译该程序,并说“缺少函数结尾的返回”。(即使在这里,去也很笨log.Panic
没有终止功能。)
在其他情况下:
panic
时的东西真的发生了连线,如编程逻辑错误。os.Exit
时,你要立即退出,与指定的退出代码。
panic
由于错误易于理解,并且避免导入任何其他软件包,因此常用于错误退出。这并不意味着它是好的,还是惯用的做法!。它只是示例代码节省空间的设备。IRL储备panic
用于非常特殊的情况。