相当于java的finalize方法

发布于 2024-10-10 21:52:23 字数 218 浏览 3 评论 0原文

Go中有类似java Finalize的方法吗?如果我有一个类型结构,例如

    type Foo struct {
        f *os.File
        ....
    }

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

如何确保当对象被垃圾收集时,文件已关闭?

Is there any method like java finalize in Go? If I've a type struct like

    type Foo struct {
        f *os.File
        ....
    }

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

How can I make sure that when Object is garbage collected, the file is closed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心如荒岛 2024-10-17 21:52:23

在 java 中你也不会这样做。在 java 中正确的做法是使用一个 finally 块来将其关闭在您打开的位置附近。

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

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

在go中,你会这样做:

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

You wouldn't do that in java, either. The correct thing to do in java is to have a finally block that closes it somewhere near where you opened up.

You'd use a similar pattern in go with a defer function to do the cleanup. For example, if you did this (java):

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

In go, you'd do this:

open();
defer close();
// do stuff
丶情人眼里出诗心の 2024-10-17 21:52:23

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

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

runtime.SetFinalizer iirc. But its considered a bad thing and isn't guaranteed to run before program exit

EDIT: As mentioned below, the current os package already calls runtime.SetFinalizer on files. However, SetFinalizer shouldn't be relied upon. As an example of why, I had a file-server-like application where I forgot to close open file. The process would usually get to about 300 open files before the GC picked them up and called their finalizer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文