我有两个结构。一个从另一个继承。
type Animal struct {
Name string `json:"name"`
}
type Dog struct {
Animal
Color string `json:"color"`
}
当我通过传递而进入Unmarshal
至Dog
时:
{
"name": "Loki",
"color": "Brown"
}
我得到一个*encoding/json.InvalidUnmarshalError
。 2019/03/10 00:22:35 json: Unmarshal(nil *main.Dog)
那是为什么?
这是解组代码:
func main() {
var dog *Dog
err := json.Unmarshal([]byte(`{
"name": "Loki",
"color": "Brown"
}`), dog)
if err != nil {
log.Fatal(err)
}
}
答案 0 :(得分:2)
那是因为变量dog
为nil。尝试将其初始化为指向空的Dog
。或者将其设置为Dog
而不是指向Dog
的指针,然后将地址传递到Unmarshal
。
答案 1 :(得分:1)
首先,要弄清楚概念-Golang中没有继承。 Golang比继承更喜欢组合。您在Animal
和Dog
中所做的事情在Go中称为embedding。
第二,正确使用json.Unmarshal
的方法是将指针作为第二个参数传递。因此,要修正您的代码:
func main() {
var dog Dog
err := json.Unmarshal([]byte(`{
"name": "Loki",
"color": "Brown"
}`), &dog)
if err != nil {
log.Fatal(err)
}
}
如果您熟悉C,可以将json.Unmarshal
与scanf
类似。调用方将地址传递到scanf
,以便scanf
可以“填充值”到指针所表示的存储位置。