1 回答
TA贡献1829条经验 获得超9个赞
Go团队之前讨论过这个问题,结论是不增加支持。引用 minux:
就个人而言,我更喜欢处理程序退出与程序崩溃完全相同的风格。我相信无论你怎么努力,你的程序在一些不可预见的情况下仍然会崩溃;例如,内存不足会使任何表现良好的 Go 程序崩溃,对此您无能为力;所以最好为他们设计。如果你遵循这个,你就不会觉得需要 atexit 来清理(因为当你的程序崩溃时, atexit 将无法工作,所以你根本不能依赖它)。
但你仍然有一些选择:
处理 CTRL+C
如果你想在你的程序被CTRL+C(SIGINT)终止时做一些事情
对象终结器
另请注意,您可以为指针值注册终结器函数。当垃圾收集器发现一个无法访问的块与关联的终结器时,它会清除关联并f(x)在单独的 goroutine 中运行。
您可以注册这样的终结器,runtime.SetFinalizer()这对您来说可能就足够了,但请注意:
不能保证终结器会在程序退出之前运行,因此通常它们仅用于在长时间运行的程序期间释放与对象关联的非内存资源。
看这个例子:
type Person struct {
Name string
Age int
}
func main() {
go func() {
p := &Person{"Bob", 20}
runtime.SetFinalizer(p, func(p2 *Person) {
log.Println("Finalizing", p2)
})
runtime.GC()
}()
time.Sleep(time.Second * 1)
log.Println("Done")
}
输出(去游乐场):
2009/11/10 23:00:00 Finalizing &{Bob 20}
2009/11/10 23:00:01 Done
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报