将元帅提升为结构

时间:2019-03-10 08:18:37

标签: go

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

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

type Dog struct {
    Animal
    Color string `json:"color"`
}

当我通过传递而进入UnmarshalDog时:

{
  "name": "Loki",
  "color": "Brown"
}

我得到一个*encoding/json.InvalidUnmarshalError2019/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)
    }
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

首先,要弄清楚概念-Golang中没有继承。 Golang比继承更喜欢组合。您在AnimalDog中所做的事情在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.Unmarshalscanf类似。调用方将地址传递到scanf,以便scanf可以“填充值”到指针所表示的存储位置。