发出依赖于顺序的多个defer条语句还是推迟一个封装逻辑的匿名函数是更安全还是更惯用?

例如:

defer os.Remove(tempFile.Name())
defer tempFile.Close()

在上面的情况下,语法很少,但是延迟的顺序与要执行的逻辑相反.

在下面的情况下,有更多的行,更多的"语法",但是逻辑的顺序更自然:

defer func() {
    tempFile.Close()
    os.Remove(tempFile.Name())
}()

你要用哪一个?

推荐答案

在本例中,匿名函数更易于阅读,尤其是在添加了错误处理功能之后.

f, err := ioutil.TempFile("", "prefix")
if err != nil {
  log.Println("creating temp file:", err)
  return
}
defer func() {
  err := f.Close()
  if err != nil {
    log.Println("close:", err)
  }
  err = os.Remove(f.Name())
  if err != nil {
    log.Println("remove:", err)
  }
}()

如果您有多个资源,那么多个defer通常是合适的.

Go相关问答推荐

Go -SDP服务器读缓冲区不会更改任何内容

Go在使用HTTP代理时如何处理DNS请求?

[0]Func()as";请勿比较哨兵类型

Golang应用程序:所请求的资源上不存在HTTP-Control-Allow-Origin标头

创建使用逗号而不是加号分隔OU的CSR

如果values.yaml文件中不存在某个属性,如何返回默认的FALSE?

如何模拟go的Elastic search SDK?

为什么要立即调用内联函数,而不仅仅是调用其包含的函数?

如果第一次匹配条件,如何跳过切片中的值

Go 中的sync.Cond 与 Wait 方法

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

io.Reader 无限循环与 fmt.Fscan

从 eBPF LRU 哈希映射中错误驱逐的元素

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

golang 中的可变参数函数

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

在 connect-go 拦截器中修改响应体

Go 导入范围查找 protobuf 类型

正则表达式处理数字签名的多个条目

不能使用 *T 类型的变量作为参数类型