一尘不染

Go中有什么与finally()相反的init()吗?

go

Go中有什么与init()包装内部的功能相反吗?


阅读 177

收藏
2020-07-02

共1个答案

一尘不染

Go团队之前已经讨论过这一点,结论是不增加对此的支持。报价minux

就个人而言,我更喜欢程序退出与程序崩溃完全相同的处理方式。我相信,无论您多么努力,程序在某些无法预料的情况下仍然可能崩溃;例如,内存不足会导致任何性能良好的Go程序崩溃,而您对此无能为力。因此最好为他们设计。如果您遵循此步骤,您将不会感觉到需要清理atexit(因为当程序崩溃时,atexit无法正常工作,因此您根本无法依赖它)。

但是您仍然有一些选择:

处理方式 CTRL+C

如果您想在用CTRL+CSIGINT)终止程序时执行某些操作。

对象终结器

还要注意,您可以为指针值注册一个终结器函数。当垃圾收集器找到带有关联的终结器的无法访问的块时,它将清除该关联并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
2020-07-02