在Go中有没有像java finalize这样的方法?如果我有一个类型的结构
type Foo struct {
f *os.File
....
}
func (p *Foo) finalize() {
p.f.close( )
}
Run Code Online (Sandbox Code Playgroud)
如何确保在对象被垃圾回收时,文件已关闭?
Dus*_*tin 16
你也不会在java中这样做.在java中正确的做法是finally在你打开的地方附近有一个块关闭它.
您可以使用类似的模式defer来执行清理功能.例如,如果你这样做(java):
try {
open();
// do stuff
} finally {
close();
}
Run Code Online (Sandbox Code Playgroud)
在go,你会这样做:
open();
defer close();
// do stuff
Run Code Online (Sandbox Code Playgroud)
runtime.SetFinalizerIIRC.但它被认为是一件坏事,并不保证在程序退出之前运行
编辑:如下所述,当前os包已经调用runtime.SetFinalizer文件.但是,SetFinalizer不应该依赖.作为原因的一个例子,我有一个类似文件服务器的应用程序,我忘了关闭打开的文件.在GC选择它们并调用它们的终结器之前,该过程通常会获得大约300个打开的文件.