11

Go 中是否有与包内的功能相反的东西init()

4

1 回答 1

9

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

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

但是您仍然有一些选择:

处理CTRL+C

如果您想在程序被CTRL+C( SIGINT ) 终止时执行某些操作,您可以这样做,请参阅:

Golang:是否可以以“延迟”方式捕获 Ctrl+C 信号并运行清理功能?

对象终结器

另请注意,您可以为指针值注册终结器函数。当垃圾收集器发现一个带有关联终结器的不可访问块时,它会清除关联并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
于 2015-06-04T10:03:49.683 回答