TL;DR

  • Go で複数のエラーを 1 つにまとめるには、errors.Join を使う。
  • まとめたエラーを分解するには、interface{ Unwrap() []error } に型アサーションしてから Unwrap メソッドを呼ぶ。

背景

複数のエラーを 1 つの error として返し、呼び出し元で 1 つずつ処理したかった。

検証

エラーを集約する

errors.Join に複数のエラーを渡すと、1 つのエラーにまとめられる。

err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)

エラーを分解する

集約したエラーを interface{ Unwrap() []error } に型アサーションし、Unwrap メソッドを呼ぶと、元のエラーのスライスを取り出せる。

errs := err.(interface{ Unwrap() []error })
for _, e := range errs.Unwrap() {
	fmt.Println(e)
}

キーワード

参考