为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中是否有类似 finally() 之类的东西与 init() 正好相反?

Go 中是否有类似 finally() 之类的东西与 init() 正好相反?

Go
萧十郎 2021-10-11 13:29:28
Go 中有什么东西与init()包内的功能相反吗?
查看完整描述

1 回答

?
PIPIONE

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


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信