鳩舎

レースしない

自前 error にエラーコードなどを付与している時

自前で Error() string なメソッドを持った struct を定義した際、エラーコードなどを持たせていて、それを取り出したい。

package main

import "log"

type MyError struct {
  Message string
}

func (e *MyError) Error() string {
  return "MyError"
}

func NewError() error {
  return &MyError{"Fail"}
}

func main() {
  err := NewError()
  log.Print(err) // これは OK。なんら問題ない
  log.Print(err.Message) // これは NG。 error interface には Message string がないため。
  myerror := err.(*MyError)
  log.Print(myerror.Message) // これで取り出せる
}

ことは単に interface だということを忘れていたという話なんだけど、結構ひっかかってわからなかった。