golang のアップデートを行いました!(1.12.1→1.13.4)

こんにちは。開発グループ・エンジニアの阿部です。
社内では abemotion って呼ばれたりもします。

こちらの記事でも紹介されている、

yomoyamablog.coconala.co.jp

apigateway で使われている golang のアップデートを行いました!

f:id:coconalainc:20191120060649j:plain
Egon Elbre Gophers 1 by Egon Elbre | CC0 1.0

今日は 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

最後に

アップデートを行うと、パフォーマンスの向上が見られたり、新機能が追加されて開発効率アップにつながるので、積極的に取り組んでいきたいですね!

f:id:coconalainc:20191120061031j:plain