布団の中にいたい

Elasticsearchいじったり、Androidアプリ書いたり。最近は数学の勉強が楽しくなってきました。

エラーの分岐にpkg/errorsを使う

modelのロジックが複数の種類のエラーを返す想定で出力を変えたいなーと思っていろいろ調べたのでメモ。

どうやったらシンプルにできるかなーと考えてたんですが、pkg/errorsを使う形に落ち着きました。

github.com

だいたい以下のような感じで、独自のエラー用の構造体を作って、pkg/errorsのCauseを使って分岐するだけです。このやり方自体もpkg/errors/errors.goのコメントにかかれています。

errors/errors.go at master · pkg/errors · GitHub

package main

import (
    "log"

    "github.com/pkg/errors"
)

type SampleError struct{}

func (e *SampleError) Error() string {
    return "sample error"
}

func main() {
    err := &SampleError{}

    switch errors.Cause(err).(type) {
    case *SampleError:
        log.Println("sample")
    default:
        log.Println("default")
    }
}

シンプルですが、APIでレスポンスを出し分けたいとかに便利だと思います。