亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UnmarshalJSON 導致堆棧溢出

UnmarshalJSON 導致堆棧溢出

Go
慕虎7371278 2021-12-07 10:57:30
這有效: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.


查看完整回答
反對 回復 2021-12-07
  • 1 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號