0

我是 Go 新手,我必须编写一个应用程序,该应用程序必须在各个点打开大量文件。打开每个文件的代码是

fl, err := os.Open(..)
check(err)
defer fl.Close()

如果出现任何问题,check只需调用where即可。panic

现在,正如我所说,该片段重复了很多次。我想要这样的东西:

func foo(f string){
    fl, err := os.Open(f)
    check(err)
    defer fl.Close() //lolwut
}

当然一旦foo返回,defer就会启动并关闭文件。

有没有办法推迟一个函数的延迟,直到它的调用者决定它的时间?

到目前为止,我尝试做的是,将 defer 放在一个匿名函数中,foo返回它并让调用者执行(最好在单行中)。然而,我在实现这一点时遇到了一些障碍,我什至不确定这是否是正确的方法。

tl;dr:有没有办法将延迟推迟到 Go 中的调用函数?

4

1 回答 1

1

我认为你在设计中犯了一个错误。你最初想做的事情并没有真正的意义:如果你想推迟Close()到调用者,你就剥夺了从调用者决定释放的所有灵活性。如果调用者必须保留文件的时间超过它自己的持续时间怎么办?

您可能想将其foo()视为资源分配函数,就像io.Open()is。因此,如果一个函数调用foo(),它刚刚分配了一个资源。foo()调用者不负责释放此资源,就像在io.Open().

于 2014-08-03T15:27:44.190 回答