本当にただのメモ

なるべく Qiita に投稿しよう

Go のエラーは %#v で出力すると吉

どの package の処理でエラーになったのかが明解になり、トラブルシューティングの助けになる。

ただ、個人的には %T: %s が一番分かりやすくて好き。書き方がちょっとダサいけど ... 。

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Name string `json:"name"`
}

func main() {
    b := []byte(`[{ "name": "John" }]`)
    foo := Foo{}
    if err := json.Unmarshal(b, &foo); err != nil {
        p("[%v]     " + fmt.Sprintf("%v", err))
        p("[%#v]    " + fmt.Sprintf("%#v", err))
        p("[%T: %s] " + fmt.Sprintf("%T: %s", err, err))

    }
}

func p(msg string) { fmt.Println(msg) }

出力結果

[%v]     json: cannot unmarshal array into Go value of type main.Foo
[%#v]    &json.UnmarshalTypeError{Value:"array", Type:(*reflect.rtype)(0x1127a0), Offset:1, Struct:"", Field:""}
[%T: %s] *json.UnmarshalTypeError: json: cannot unmarshal array into Go value of type main.Foo

https://play.golang.org/p/uXbEY2MfGo0