发出多个取决于顺序的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 - 多重延迟与延迟匿名功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32541870/

10-16 17:40