Go 将提升的字段解组到结构中

Go 将提升的字段解组到结构中,go,Go,我有两个结构。一个继承另一个 type Animal struct { Name string `json:"name"` } type Dog struct { Animal Color string `json:"color"` } 当我通过路过的方式去解开狗狗时: { "name": "Loki", "color": "Brown" } 我得到一个*encoding/json.invalidUnmarshaleror。2019/03/10 00:22:

我有两个结构。一个继承另一个

type Animal struct {
    Name string `json:"name"`
}

type Dog struct {
    Animal
    Color string `json:"color"`
}
当我通过路过的方式去解开狗狗时:

{
  "name": "Loki",
  "color": "Brown"
}
我得到一个*encoding/json.invalidUnmarshaleror。2019/03/10 00:22:35 json:Unmarshalnil*main.Dog

为什么呢

以下是解组代码:

func main() {
    var dog *Dog

    err := json.Unmarshal([]byte(`{
        "name": "Loki",
        "color": "Brown"
    }`), dog)

    if err != nil {
        log.Fatal(err)
    }
}

那是因为变量dog是nil。尝试将其初始化为指向空狗。或者将其设置为Dog而不是Dog指针,并将地址传递给Unmarshal。

这是因为变量Dog为nil。尝试将其初始化为指向空狗。或者将其设置为Dog而不是指向Dog的指针,并将地址传递给Unmarshal。

首先,为了明确概念,Golang中没有继承。戈朗喜欢构图而不是继承。你们在那个里对动物和狗做的事叫做围棋

其次,使用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就可以将值填充到指针表示的内存位置。

首先,为了明确概念,Golang中没有继承。戈朗喜欢构图而不是继承。你们在那个里对动物和狗做的事叫做围棋

其次,使用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可以将值填充到指针表示的内存位置