Go中的finally()是否与init()相反?

时间:2015-06-04 09:44:14

标签: go shutdown-hook application-shutdown

Go中是否存在与init()在包内的内容相反的内容?

1 个答案:

答案 0 :(得分:9)

Go团队之前讨论过这个问题,结论并不是为了增加对它的支持。 Quoting minux

  

就个人而言,我更喜欢程序退出处理与程序崩溃完全相同的样式。   我相信无论你怎么努力,你的程序仍然会在一些无法预料的情况下崩溃   的情况;例如,内存不足会导致任何表现良好的Go程序崩溃,   你无能为力;所以为它们设计会更好。   如果你遵循这个,你就不会觉得需要atexit来清理(因为当你的程序   崩溃,atexit赢了工作,所以你根本不能依赖它。)

但你还有一些选择:

处理 CTRL + C

如果你想在 CTRL + C SIGINT)终止程序时做某事,你可以这样做,见:

Golang: Is it possible to capture a Ctrl+C signal and run a cleanup function, in a "defer" fashion?

对象终结器

另请注意,您可以为指针值注册终结器函数。当垃圾收集器找到具有关联终结器的无法访问的块时,它会清除关联并在单独的goroutine中运行f(x)

您可以使用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")
}

输出(Go Playground):

2009/11/10 23:00:00 Finalizing &{Bob 20}
2009/11/10 23:00:01 Done