gpt4 book ai didi

go - UnmarshalJSON 导致堆栈溢出

转载 作者:IT王子 更新时间:2023-10-29 02:15:08 28 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这个

dec.Decode(&i)

将调用您的 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
// ...

Playground :http://play.golang.org/p/HWamV3MbvW .

类型 a 没有方法(因此没有堆栈溢出),但是是 convertibleA

关于go - UnmarshalJSON 导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34859449/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com