在go中,是否有一种在程序终止时执行代码的方法?

在go中,是否有一种在程序终止时执行代码的方法?,go,deferred-execution,Go,Deferred Execution,我知道您可以在任何包中定义名为init的函数,这些函数将在main之前执行。我用它打开我的日志文件和数据库连接 是否有一种方法可以定义程序结束时将执行的代码,因为它到达main函数的末尾,或者因为它被中断?我能想到的唯一方法是在main使用的每个包上手动调用一个不同的terminate函数,但这非常冗长且容易出错。Go开发人员考虑了Catexit功能,但采用它的想法被拒绝 来自golang nuts的一个相关信息: : Atexit在单线程、短生命周期中可能有意义 程序,但我怀疑它是否在 长时间

我知道您可以在任何包中定义名为
init
的函数,这些函数将在
main
之前执行。我用它打开我的日志文件和数据库连接


是否有一种方法可以定义程序结束时将执行的代码,因为它到达
main
函数的末尾,或者因为它被中断?我能想到的唯一方法是在main使用的每个包上手动调用一个不同的
terminate
函数,但这非常冗长且容易出错。

Go开发人员考虑了C
atexit
功能,但采用它的想法被拒绝

来自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,它仍然不会被调用。是否有用?这就是我在执行结束时执行操作的方式。