概要 Go言語に限らずではありますが レイヤ間のエラー伝搬 外部APIを叩いた時のエラーコードハンドリング HTTPやgRPCとしてレスポンスを返す時のエラーハンドリング で悩むことは多いと思います。 今回はそれの1つの方針を紹介します。 課題 レイヤ間のエラー伝搬 Goのエラーは基本的に例外を扱わず、常にハンドリングする前提です。なので user, err := findUser(id) if err != nil { return User{}, err } みたいなコードが大量に生まれます。 一方でその関数を呼び出した側ではそれがどんな種類のエラーなのか分かりません。 NotFoundだったりDB自体のエラーだったりしますが、それを外層のレイヤ(HTTPレスポンスを返すハンドラなど)でハンドリングするのは辛いです。 レイヤ毎のエラー内容を知る必要が出てくるため余計な依存が生まれてしま