カスタムエラー【Go】
fmtパッケージによるerrorの出力内容を変更できる、interfaceです。
stringerと同様です。interfaceは次のように定義されています。
type error interface { Error() string }
よって、Error() stringを、対象とする型のメソッドに指定して、
編集した内容をreturnするだけです。
type UserNotFound struct { UserName string } func (err *UserNotFound) Error() string { // errorの場合は、必ずポインタレシーバーとする。他エラーと区別して処理を分けるには、アドレスが必要なため return fmt.Sprintf("Sorry. This user is not found. :%v", err.UserName) } func SearchUser() error { ok := false // 単純にするため、意図的にerrorを返すようにする if ok { return nil } return &UserNotFound{"Mike"} // Error()がポインタレシーバーなので、アドレスとしてerrorを返す } func main() { if err := SearchUser(); err != nil { fmt.Println(err) // Sorry. This user is not found. :Mike } }
注意点は、Error()メソッドをポインタレシーバーにすることです。
値レシーバーにしてしまうと、プログラム的にerror内容による区別がつけられなくなり、
例えば任意に発生させるエラーの内容と、ioパッケージが返すエラーの内容の違いを
プログラム上で認識させて、場合分けするといったことができなくなります。