こんにちは。開発グループ・エンジニアの阿部です。
社内では abemotion って呼ばれたりもします。
こちらの記事でも紹介されている、
apigateway で使われている golang のアップデートを行いました!
今日は Go Modules と Error wrapping についてご説明します。
※ アップデート手順は、1.12へ更新する際と変わらなかったため、割愛
Go Modules
https://blog.golang.org/using-go-modules
1.13 より、モジュールモードがデフォルトになると、上記Go言語の公式ブログに書いてありました。
ですが、いざリリースノートを見てみると、以前として GO111MODULE
環境変数は auto
のままでした。
auto
に設定されていると、$GOPATH/src
以下のコードでは従来の GOPATH モードで、それ以外の場所ではモジュールモードで動作します。
ですので設定を1つ減らしたかったのですが、今回も環境変数を設定しています。
$ export GO111MODULE=on
Error wrapping
1.13から、エラーラッピングの機能が追加されました!
fmt.Errorf
にラップされたエラーを作成するための %w
書式指定子が用意されています。
fmt.Errorf("Wrapping message: %w", err)
あわせてerrors
パッケージに追加された関数を紹介します。
errors.Is
Is
関数は、エラーの比較を行います。
Before Go 1.13
if internalError == internalError {...}
In Go 1.13
if errors.Is(internalError, internalError) {...}
この関数は、エラーラッピングが考慮されていて、
ラップされていても、比較を行うことができます。
err := fmt.Errorf("Wrapping message: %w", internalError) if err == internalError {...} // false if errors.Is(err, internalError) {...} // true
errors.As
As
関数は、型のアサーションを行います。
Before Go 1.13
if e, ok := err.(*PermissionError); ok { … }
In Go 1.13
var e *PermissionError if errors.As(err, &e) {...}
As
関数も、エラーラッピングが考慮されていて、
ラップされていても、型アサーションを行うことができます。
errors.Unwrap
Unwrap
関数は、fmt.Errorf("%w")
でラップされた error
を取り出すことができます。
internalError := errors.New("message") err := fmt.Errorf("Wrapping message: %w", internalError) fmt.Printf("%v\n", errors.Is(err, internalError)) // true fmt.Printf("%v\n", err == internalError) // false fmt.Printf("%v\n", errors.Unwrap(err) == internalError) // true
最後に
アップデートを行うと、パフォーマンスの向上が見られたり、新機能が追加されて開発効率アップにつながるので、積極的に取り組んでいきたいですね!