いろいろ備忘録日記

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

Goメモ-646 (Go 1.26でerrors.AsType関数が追加される)(errors.As, ジェネリック版)

関連記事

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

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

いつもお世話になっている Anton さんのブログで以下の記事がアップされていました。

antonz.org

提案された errors.AsType が採択されて、Go 1.26で導入されるみたいですね。

個人的に errors.As の使い方がよく分からなくなるので、これは嬉しいです。

以下、自分用のメモ。

サンプル

main.go

package main

import (
        "errors"
        "flag"
        "fmt"
)

type (
        apperror   struct{}
        othererror struct{}

        _args struct {
                raiseErr bool
        }
)

var (
        args _args
)

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

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

func fn(b bool) error {
        if b {
                return &apperror{}
        } else {
                return &othererror{}
        }
}

func main() {
        flag.BoolVar(&args.raiseErr, "err", false, "")
        flag.Parse()

        err := fn(args.raiseErr)
        if err != nil {
                if appE, ok := errors.AsType[*apperror](err); ok {
                        fmt.Printf("error: %v\n", appE)
                } else {
                        fmt.Printf("error: %T:%[1]v\n", err)
                }
        }
}

前準備

Go 1.26 は同然まだリリースされていないので gotip を使います。

$ go install golang.org/dl/gotip@latest
$ gotip download
$ gotip version
go version go1.26-devel_0d0d5c9 Fri Dec 5 17:31:30 2025 -0800 linux/amd64

Taskfile.yml

# https://taskfile.dev

version: '3'

tasks:
  default:
    cmds:
      - gotip version
      - gotip build -o app main.go
      - defer: rm -f ./app
      - ./app
      - ./app -err

実行

$ task
task: [default] gotip version
go version go1.26-devel_0d0d5c9 Fri Dec 5 17:31:30 2025 -0800 linux/amd64
task: [default] gotip build -o app main.go
task: [default] ./app
error: *main.othererror:othererror
task: [default] ./app -err
error: apperror
task: [default] rm -f ./app

参考情報

antonz.org

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


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

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