Unmarshal продвигал поля в структуру - PullRequest
0 голосов
/ 10 марта 2019

У меня есть две структуры. Один наследует от другого.

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

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Это потому, что переменная dog равна нулю.Попробуйте инициализировать его так, чтобы он указывал на пустой Dog.Или укажите Dog вместо указателя на Dog и передайте адрес на Unmarshal.

1 голос
/ 10 марта 2019

Прежде всего, чтобы прояснить понятия - на Голанге нет наследства.Голанг предпочитает композицию наследству.То, что вы делаете с Animal и Dog, там называется встраивание в Go.

Во-вторых, правильный способ использования 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 мог "заполнить значение" в ячейке памяти, представленной указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...