在go中,是否有一种在程序终止时执行代码的方法?
我知道您可以在任何包中定义名为在go中,是否有一种在程序终止时执行代码的方法?,go,deferred-execution,Go,Deferred Execution,我知道您可以在任何包中定义名为init的函数,这些函数将在main之前执行。我用它打开我的日志文件和数据库连接 是否有一种方法可以定义程序结束时将执行的代码,因为它到达main函数的末尾,或者因为它被中断?我能想到的唯一方法是在main使用的每个包上手动调用一个不同的terminate函数,但这非常冗长且容易出错。Go开发人员考虑了Catexit功能,但采用它的想法被拒绝 来自golang nuts的一个相关信息: : Atexit在单线程、短生命周期中可能有意义 程序,但我怀疑它是否在 长时间
init
的函数,这些函数将在main
之前执行。我用它打开我的日志文件和数据库连接
是否有一种方法可以定义程序结束时将执行的代码,因为它到达
main
函数的末尾,或者因为它被中断?我能想到的唯一方法是在main使用的每个包上手动调用一个不同的terminate
函数,但这非常冗长且容易出错。Go开发人员考虑了Catexit
功能,但采用它的想法被拒绝
来自golang nuts的一个相关信息:
:
Atexit在单线程、短生命周期中可能有意义
程序,但我怀疑它是否在
长时间运行的多线程服务器。
我看到很多C++程序挂在出口上,因为
他们运行的全局析构函数实际上不需要
运行,那些析构函数正在清理并释放
由操作系统回收的内存
无论如何,只要程序能进入退出系统调用就好了。
与所有的痛苦相比,当你感到痛苦时,需要打电话给Flush
一个有缓冲区的似乎是完全合理的
对于正确执行长时间运行的
节目
即使忽略了这一问题,atexit也带来了更多问题
控制线程,您必须回答以下问题
是否所有其他goroutine都在atexit处理程序之前停止
跑如果没有,他们如何避免干预?如果是,如果是呢
一个人持有处理程序需要的锁?不断地
我根本不想加入退欧
:
唯一完全可靠的机制是调用
真正的程序,并在真正的程序完成时进行清理。那个
在任何语言中都是正确的,而不仅仅是去
在我看来,os.AtExit不是一个好主意。它是
一种非结构化的工具,可在程序退出时导致某些事情发生
时间以不可预测的顺序排列。这会导致一些奇怪的情况,比如
需要很长时间才能退出的程序,这一操作应该
非常快。它还导致了一些奇怪的函数,比如C函数退出,
这或多或少意味着退出但不运行atexit函数
也就是说,我认为一个特殊的退出函数对应于init
函数是一个有趣的概念。它的结构应该是
AtExit缺少(即,退出函数按与运行时相反的顺序运行)
init函数已运行)
但是如果你的程序被病毒杀死,退出函数也帮不了你
内核或崩溃,因为您调用了一些获得分段的C代码
违反
总的来说,我同意jnml的答案。但是,如果您仍然想这样做,您可以在
main()
函数中使用,如下所示:。如果在阅读了所有这些内容(可能已经看过)之后,您仍然需要atexit-请看一看:)只有当程序通过完成main
而终止时,才可以从main
延迟函数,如果它通过os.Exit
退出,则不起作用。与原始的atexit
相比,它在调用Exit
时也起作用。当程序终止时出现未恢复的死机
@peters,则不起作用。但是,您可以在延迟功能中恢复,因此,在main
@nemo:将我的评论翻译成伪代码中,如果恐慌而不恢复,那么就不要延迟,中没有反对延迟的真正论点代码>。如果使用os.Exit,它仍然不会被调用。是否有用?这就是我在执行结束时执行操作的方式。