Как разобрать динамический YAML на карту string -> string -> struct в Go?

Я пытаюсь разобрать данные YAML, найденные ниже в этом коде. Что не так с моим определением структуры? Каким он должен быть, чтобы соответствовать формату данных?

Игровая площадка

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

var data = `
fruits:
  apple:
    comments:
    - good
    - sweet
    from: US 
  pear:
    comments:
    - nice
    from: Canada
veggies:
  potato:
    comments:
    - filling
    from: UK
`

type List struct {
    Category map[string]struct {
        Name map[string]struct {
            Comments []string `yaml:"comments"`
            From     string   `yaml:"from"`
        }
    }
}

func main() {
    var l List
    err := yaml.Unmarshal([]byte(data), &l)
    if err != nil {
        log.Fatalf("Unmarshal: %v", err)
    }
    fmt.Println(l)
}

Приведенный выше код выводит пустую карту {map[]}.

Решение:

Исправлена ​​​​детская площадка в соответствии с проверенным ответом Игровая площадка


person kittydoor    schedule 03.07.2020    source источник


Ответы (1)


Я считаю, что у вас есть две проблемы:

Во-первых, ваш тип List не соответствует вашим данным. Он ожидает что-то вроде:

---
Category:
  XXX:
    Name:
       XXX:
           Comments: [ ... ]
           From: ...

Где «XXX» — произвольные ключи. Это явно не то, что у вас есть.

Похоже, вам просто нужна карта:

type List map[string]map[string]struct{
    Comments []string
    From     string
}

Во-вторых, вы должны передать указатель на целевой объект функции Unmarshal:

    var l List
    err := yaml.Unmarshal([]byte(data), &l) // <-- note &l not l
person Flimzy    schedule 03.07.2020
comment
Благодарю вас! И за помощь в переходе на нужный этап, и за это понятное объяснение! - person kittydoor; 03.07.2020