【问题标题】:What is the possible use case for defer?defer 的可能用例是什么?
【发布时间】:2019-04-28 09:44:10
【问题描述】:

defer 关键字的实际用途是什么?

例如,不要这样写:

func main() {
    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}

我可以这样写:

func main() {
    f := createFile("/tmp/defer.txt")
    writeFile(f)
    closeFile(f)
}

那么,我为什么要使用它而不是通常的函数放置呢?

【问题讨论】:

  • Golang defer behavior的可能重复
  • 在您的简单示例中,没有什么理由(除了好的做法)。但是,在更复杂/更大的函数中,您使用 defer() 来确保无论函数如何结束都会执行某些操作——主要是未捕获的错误。例如,当我分配数据库句柄时,我总是立即执行 defer() 来关闭句柄。
  • 向该代码添加错误处理,这应该很明显。
  • 不能说得够多:您需要养成处理一切上可能出现的错误的习惯。一旦您真正开始这样做,defer 就会成为在出现问题时进行清理的非常明显的方式。

标签: go


【解决方案1】:

延迟函数总是被执行,即使在恐慌或返回语句之后。

在现实世界的代码中,在 Open/Close 类型的调用对之间会发生很多事情,而 defer 可以让您在源代码中将它们保持在一起,并且您不必为每个 return 语句重复 Close 调用。

去写一些真正的代码。 defer 的用处很快就会显露出来。

【讨论】:

    【解决方案2】:

    在捕获可能出现恐慌的代码时非常有用。

    通常在使用interface{}(“任何”类型)或反射时,您会遇到尝试转换为与数据的实际类型不匹配的类型的问题。

    defer在顶部使用一个函数来处理该错误是您节省时间并保持应用程序运行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 2015-02-10
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多