【问题标题】:Deferring deferrements in Golang在 Golang 中推迟延期
【发布时间】:2014-08-03 15:18:04
【问题描述】:

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

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

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

现在,正如我所说,sn-p 会重复很多次。我想要这样的东西:

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

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

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

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

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

【问题讨论】:

  • 没有。你不应该对每一个可能的错误感到恐慌。学会正确处理它们。
  • @Wessie 就在这里。此外,os.Open() 在错误时返回nil,这是Close() 的有效参数。您可以在 Open() 通话之后安全地推迟 Close()
  • @Wessie 文件错误的硬和快速失败恰好是我的要求,但否则我同意。干杯
  • @rath 你仍然可以使用 log.Fatal() 失败。请不要惊慌,这是不好的风格。

标签: go inline program-flow


【解决方案1】:

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

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

【讨论】:

  • What if [..] duration? 不使用foo,或者推迟到它的调用者。开个玩笑,我正在考虑做一些类似于 OO 的事情,其中​​每个类都有一个析构函数(defer),而所有子类(foo 的调用者)根本不用担心它。但是,是的,我需要用 Go 的术语重新思考设计。干杯
  • @rath Go 是一种明确设计的语言:您必须明确地跟踪和释放所有外部资源。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多