Go 戈朗延期付款

Go 戈朗延期付款,go,inline,program-flow,Go,Inline,Program Flow,我是新手,我必须编写一个应用程序,它必须在不同点打开大量文件。打开每个文件的代码是 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 } 当然,一旦fo

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

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
返回,
deep
将启动并关闭文件

有没有一种方法可以推迟函数的延迟,直到调用方决定时间

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


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

我认为您在设计中犯了一个错误。您最初想要做的事情实际上没有意义:如果您想将
Close()
延迟到调用方,那么您就失去了决定从调用方取消分配的所有灵活性。如果调用者必须在文件中保留超过其自身持续时间的时间,该怎么办


您可能希望将
foo()
视为一个资源分配函数,就像
io.Open()
一样。因此,如果一个函数调用
foo()
,那么它刚刚分配了一个资源
foo()
不负责解除分配此资源,调用者是,就像在
io.Open()

否的情况下一样。您不应该对每一个可能的错误都感到恐慌。学会正确处理它们。@Wessie就在这里。另外,
os.Open()
在出错时返回
nil
,这是
Close()
的有效参数。您可以在调用
Open()
之后安全地推迟
Close()
。@Wessie Hard&fast failure on file error恰好是我的要求,但我同意。Cheers@rath仍然可以使用log.Fatal()失败。请不要惊慌,这是一种糟糕的风格。
如果[…]持续时间怎么办?
不要使用
foo
,或者将这种延迟推迟到调用方。开玩笑的是,我想做一些类似于OO的事情,每个类都有一个析构函数(
defer
),所有子类(
foo
)的调用者都不会担心它。但是是的,我需要用围棋的术语重新思考设计。Cheers@rathGo是一种明确设计如下的语言:您必须明确跟踪和释放所有外部资源。