我是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中的调用函数?
答案 0 :(得分:1)
我认为你在设计上犯了一个错误。你最初想要做的事情并没有多大意义:如果你想将Close()
推迟到调用者,你就可以灵活地决定从调用者那里取消分配。如果呼叫者必须在文件周围保留的时间超过其自身的持续时间,该怎么办?
您可能希望将foo()
视为资源分配函数,就像io.Open()
一样。因此,如果函数调用foo()
,它刚刚分配了一个资源。 foo()
不负责取消分配此资源,调用方就像io.Open()
一样。