複数の遅延と遅延匿名関数 質問する

複数の遅延と遅延匿名関数 質問する

defer順序に依存する複数のステートメントを発行する方が安全で慣用的なのでしょうか、それともロジックをパッケージ化する匿名関数を延期する方が安全でしょうか?

例:

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

上記の場合、構文は最小限ですが、遅延の順序は実行されるロジックと逆になります。

以下のケースでは、行数が多くなり、「構文」も増えますが、ロジックはより自然な順序になっています。

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

どれを使えばいいでしょうか?

ベストアンサー1

この例では、特にエラー処理を追加すると、匿名関数が読みやすくなります。

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通常、複数の が適切です。

おすすめ記事