推迟Golang的延期交付

时间:2014-08-03 15:18:05

标签: go inline program-flow

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

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

如果出现任何问题,check只会调用panic

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

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

当然foo返回后,defer会启动并关闭该文件。

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

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

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

1 个答案:

答案 0 :(得分:1)

我认为你在设计上犯了一个错误。你最初想要做的事情并没有多大意义:如果你想将Close()推迟到调用者,你就可以灵活地决定从调用者那里取消分配。如果呼叫者必须在文件周围保留的时间超过其自身的持续时间,该怎么办?

您可能希望将foo()视为资源分配函数,就像io.Open()一样。因此,如果函数调用foo(),它刚刚分配了一个资源。 foo()不负责取消分配此资源,调用方就像io.Open()一样。