相当于java finalize方法

Nya*_*yan 7 go

在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)

  • 嗯,当然,但是任何人都希望垃圾收集器关闭他的文件并不首先关心可靠性.我一般不关心关闭时的错误,因为我通常没有其他选择. (3认同)
  • 请注意,`defer f.close()`可能会忽略错误.如果您正在写入文件,那么这很重要.有关如何正确执行此操作,请参阅https://groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ. (2认同)

cth*_*m06 7

runtime.SetFinalizerIIRC.但它被认为是一件坏事,并不保证在程序退出之前运行

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