猿问

UnmarshalJSON 导致堆栈溢出

这有效:http : //play.golang.org/p/-Kv3xAguDR。


这会导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。


我不明白为什么。JSONUnmarshaler在这种情况下使用接口的正确方法是什么?


package main


import (

    //"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 []T


func 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()

    }

}


慕虎7371278
浏览 203回答 1
1回答

偶然的你

这个dec.Decode(&i)将调用 your UnmarshalJSON,而后者又会调用Decode,依此类推。如果你需要解组你的 JSON 然后用它做一些事情,一个巧妙的技术是声明一个本地类型,将你的数据解组到它,然后转换回你想要的类型:// Type a has no UnmarshalJSON.type a Ai := 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.
随时随地看视频慕课网APP

相关分类

Go
我要回答