在Go中有没有像java finalize这样的方法?如果我有一个像
这样的类型结构 type Foo struct {
f *os.File
....
}
func (p *Foo) finalize() {
p.f.close( )
}
如何确保在对象进行垃圾回收时,文件已关闭?
答案 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个打开的文件。