【发布时间】:2011-06-05 22:16:15
【问题描述】:
Go 中有没有类似 java finalize 的方法?如果我有一个像
这样的类型结构 type Foo struct {
f *os.File
....
}
func (p *Foo) finalize() {
p.f.close( )
}
如何确保当 Object 被垃圾回收时,文件被关闭?
【问题讨论】:
标签: go
Go 中有没有类似 java finalize 的方法?如果我有一个像
这样的类型结构 type Foo struct {
f *os.File
....
}
func (p *Foo) finalize() {
p.f.close( )
}
如何确保当 Object 被垃圾回收时,文件被关闭?
【问题讨论】:
标签: go
你也不会在 java 中这样做。在 java 中正确的做法是有一个 finally 块将其关闭在您打开的位置附近的某个位置。
您可以在 go 中使用类似的模式和 defer 函数来进行清理。例如,如果你这样做(java):
try {
open();
// do stuff
} finally {
close();
}
在 go 中,你会这样做:
open();
defer close();
// do stuff
【讨论】:
defer f.close() 在 go 中可能会忽略错误。如果您正在写入文件,那么这可能很重要。请参阅此处groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ,了解如何正确操作。
runtime.SetFinalizeriirc。但它被认为是一件坏事,不能保证在程序退出之前运行
编辑:如下所述,当前的os 包已经在文件上调用runtime.SetFinalizer。但是,不应依赖 SetFinalizer。作为一个例子,我有一个类似文件服务器的应用程序,我忘记关闭打开的文件。在 GC 拾取并调用它们的终结器之前,该过程通常会获得大约 300 个打开的文件。
【讨论】:
SetFinalizer 确实是一种不好的做法。取而代之的是达斯汀的回答:使用defer 关键字。它是为资源清理而设计的。