這有效:http : //play.golang.org/p/-Kv3xAguDR。這會導致堆棧溢出:http : //play.golang.org/p/1-AsHFj51O。我不明白為什么。JSONUnmarshaler在這種情況下使用接口的正確方法是什么?package mainimport ( //"bytes" "encoding/json" "fmt" "strings")type T interface { Printer()}type A struct{ JA string }func (t A) Printer() { fmt.Print("A") }/*func (t *A) UnmarshalJSON(data []byte) error { i := A{} dec := json.NewDecoder(bytes.NewReader(data)) if err := dec.Decode(&i); err != nil { return err } i.Printer() *t = i return nil}*/var vI []Tfunc main() { vI = []T{&A{}} get()}func get() { dec := json.NewDecoder(strings.NewReader("[{\"JA\":\"OK\"}]")) if err := dec.Decode(&vI); err != nil { fmt.Print(err) } for _, v := range vI { v.Printer() }}
1 回答

偶然的你
TA貢獻1841條經驗 獲得超3個贊
這個
dec.Decode(&i)
將調用 your UnmarshalJSON,而后者又會調用Decode,依此類推。如果你需要解組你的 JSON 然后用它做一些事情,一個巧妙的技術是聲明一個本地類型,將你的數據解組到它,然后轉換回你想要的類型:
// Type a has no UnmarshalJSON.
type a A
i := a{}
dec := json.NewDecoder(bytes.NewReader(data))
if err := dec.Decode(&i); err != nil {
return err
}
// Convert back to A.
tt := A(i)
tt.Printer()
*t = tt
// ...
游樂場:http : //play.golang.org/p/HWamV3MbvW。
該類型a沒有方法(因此沒有堆棧溢出),但可以轉換為A.
- 1 回答
- 0 關注
- 225 瀏覽
添加回答
舉報
0/150
提交
取消