PR

Go言語(Golang)1.26で追加されたerrors.AsTypeの使い方|型安全なエラーハンドリング

2. 基礎

こんにちは。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以上を利用する際は、ぜひ参考にしてみて下さい。

 

この記事を書いた人
Tomoyuki

SE→ブロガーを経て、現在はSoftware Engineer(Web/Gopher)をしています!

Tomoyukiをフォローする
2. 基礎
スポンサーリンク
Tomoyukiをフォローする

コメント

タイトルとURLをコピーしました