相当于java finalize方法

时间:2011-01-08 23:40:20

标签: go

在Go中有没有像java finalize这样的方法?如果我有一个像

这样的类型结构
    type Foo struct {
        f *os.File
        ....
    }

func (p *Foo) finalize() {
     p.f.close( )           
}

如何确保在对象进行垃圾回收时,文件已关闭?

2 个答案:

答案 0 :(得分:16)

你也不会在java中这样做。在java中正确的做法是在你打开的地方附近放置一个finally块。

你在defer函数中使用类似的模式来进行清理。例如,如果你这样做(java):

try {
  open();
  // do stuff
} finally {
  close();
}

在go中,你会这样做:

open();
defer close();
// do stuff

答案 1 :(得分:7)

runtime.SetFinalizer iirc。但它被认为是一件坏事,并且无法保证在程序退出之前运行

编辑:如下所述,当前os包已经在文件上调用runtime.SetFinalizer。但是,不应依赖SetFinalizer。作为原因的一个例子,我有一个类似文件服务器的应用程序,我忘了关闭打开的文件。在GC选择它们并调用它们的终结器之前,该过程通常会得到大约300个打开的文件。