いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-373 (Go 1.20 から %w を複数指定できるようになってた)(Wrapping multiple errors)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにとりあえずメモメモ。。。

Go 1.20 から、エラーの際に利用する %w verb が複数指定出来るようになってたんですね。

知らなかったです。

サンプル

package errs

import (
    "errors"
    "fmt"

    "github.com/devlights/gomy/output"
)

type _wmErr struct {
    m string
}

type _wmErr2 struct {
}

func (me *_wmErr) Error() string {
    return me.m
}

func (me *_wmErr2) Error() string {
    return ""
}

// WrapMultipleError は、Go 1.20 で導入された %w を複数指定できるようになった機能のサンプルです。
//
// # REFERENCES
//   - https://future-architect.github.io/articles/20230126a/
//   - https://tip.golang.org/doc/go1.20#errors
func WrapMultipleError() error {
    //
    // Go 1.20 で、 %w を複数指定できるようになった
    //
    var (
        e1 = errors.New("error 1")
        e2 = errors.New("error 2")
        e3 = &_wmErr{m: "error 3"}
    )

    e4 := fmt.Errorf("%w,%w,%w", e1, e2, e3)
    output.Stdoutf("[e4]", "%T: %v\n", e4, e4)

    //
    // errors.Is でちゃんと判定される
    //
    output.Stdoutl("[Is(e4, e2)]", errors.Is(e4, e2))

    //
    // errors.As でちゃんと判定される
    //
    var wme *_wmErr
    var wme2 *_wmErr2
    output.Stdoutl("[As(e4, &wme) ]", errors.As(e4, &wme))
    output.Stdoutl("[As(e4, &wme2)]", errors.As(e4, &wme2))

    return nil
}

実行すると以下のようになります。

$ task
task: Task "build" is up to date
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: error_wrap_multiple_error

[Name] "error_wrap_multiple_error"
[e4]                 *fmt.wrapErrors: error 1,error 2,error 3
[Is(e4, e2)]         true
[As(e4, &wme) ]      true
[As(e4, &wme2)]      false


[Elapsed] 25.21µs

参考情報

https://tip.golang.org/doc/go1.20#errors

Goのおすすめ書籍

上の書籍の日本語版が下です。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。