こんにちは。Tomoyuki(@tomoyuki65)です。
Go言語(Golang)のバージョン1.26からerrorsパッケージに新しい関数「errors.AsType」が追加されました。
これはerrors.Asのジェネリクス版になっており、ラップされたエラーから「特定の型のエラー」をより安全、かつ簡潔に取り出せます。
この記事では、そんなGo言語(Golang)のerrors.AsTypeの使い方についてご紹介します。
Go言語(Golang)1.26で追加されたerrors.AsTypeの使い方|型安全なエラーハンドリング
errorsパッケージとは?
Go言語(Golang)のerrorsパッケージは、エラーを生成・比較・ラップ(包む)するための標準ライブラリです。主にerror型を扱いやすくするために使われます。
従来の「errors.As」を使った例(Go1.25以前)
まず従来の「errors.As」を使った例としては次の通りです。
package main
import (
"errors"
"fmt"
)
// カスタムエラー定義
type CustomErr struct {
Msg string
}
// error型に合わせてstring型の戻り値を持つError()のメソッドを定義
func (e *CustomErr) Error() string {
return fmt.Sprintf("%s", e.Msg)
}
// カスタムエラー作成関数
func CreateCustomErr(msg string) error {
return &CustomErr{Msg: msg}
}
// 処理用関数
func process() error {
err := CreateCustomErr("XXXエラー")
if err != nil {
return fmt.Errorf("processの処理でエラー: %w", err)
}
return nil
}
func main() {
// 処理用関数を実行
err := process()
// CustomErrかどうかをチェック
var cErr *CustomErr
if errors.As(err, &cErr) {
fmt.Printf("カスタムエラーが発生しました。[%v]\n", err)
fmt.Printf("cErr=%v\n", cErr)
} else {
fmt.Printf("その他のエラーが発生しました。[%v]\n", err)
}
}
※errors.Asを使う際は、事前に「var cErr *CustomErr」のようにポインタ変数の定義が必要。
実行結果
カスタムエラーが発生しました。[processの処理でエラー: XXXエラー]
cErr=XXXエラー
新しい「errors.AsType」を使った例(Go1.26以上)
次に上記の例を新しい「errors.AsType」を使って書き換えたのが次の通りです。
package main
import (
"errors"
"fmt"
)
// カスタムエラー定義
type CustomErr struct {
Msg string
}
// error型に合わせてstring型の戻り値を持つError()のメソッドを定義
func (e *CustomErr) Error() string {
return fmt.Sprintf("%s", e.Msg)
}
// カスタムエラー作成関数
func CreateCustomErr(msg string) error {
return &CustomErr{Msg: msg}
}
// 処理用関数
func process() error {
err := CreateCustomErr("XXXエラー")
if err != nil {
return fmt.Errorf("processの処理でエラー: %w", err)
}
return nil
}
func main() {
// 処理用関数を実行
err := process()
// CustomErrかどうかをチェック
if cErr, ok := errors.AsType[*CustomErr](err); ok {
fmt.Printf("カスタムエラーが発生しました。[%v]\n", err)
fmt.Printf("cErr=%v\n", cErr)
} else {
fmt.Printf("その他のエラーが発生しました。[%v]\n", err)
}
}
※errors.AsTypeを使うと型安全かつポインタ引数不要でシンプルに書けます。
実行結果
カスタムエラーが発生しました。[processの処理でエラー: XXXエラー]
cErr=XXXエラー
最後に
今回はGo言語(Golang)のerrors.AsTypeの使い方についてご紹介しました。
errors.AsTypeは従来のerrors.Asの改善版となっているため、Goのバージョン1.26以上ならこっちを使うの推薦です。
Goのバージョン1.26以上を利用する際は、ぜひ参考にしてみて下さい。



コメント