鱒身(Masu_mi)のブログ

知った事をメモする場所。

os.Exit() とdeferを両立する

Qiitaでみんなが困ってたので比較的まっとうな解決策を書いてみる。

tl;dr

下のようにos.Exit() を無名関数に包んで先頭でdefer 実行する。

func TestMain(* testing.M) {
  var ret int
  defer func(){ os.Exit(ret) }()

  setup()
  defer teardown()
  if isComplexCondition {
    setupComplexCondition()
    defer teardownComplexCondition()
  }
  ret = m.Run()
}

詳細

  • main, TestMain の後処理なので対象関数内で実行すると分かりやすい
  • 確実に実行されてほしい後処理なのだからdefer
  • 最後に実行されたいのだから先頭のdefer
  • 受け取る値の評価は遅延したいので無名関数で囲う