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

みんな困ってたので比較的まっとうな解決策を考えてみる。

tl;dr

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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
  • 受け取る値の評価は遅延したいので無名関数で囲う
Tags: Go
comments powered by Disqus