使用结构解析YAML

I’ve created the following YAML file to provide some config which users need to provide:

Environments:
 sys1:
    models:
    - app-type: app1
      service-type: “fds"

    - app-type: app2
      service-type: “era”
 sys2:
    models:
    - app-type: app1
      service-type: “fds"

    - app-type: app2
      service-type: “era"

https://codebeautify.org/yaml-validator/cbb349ec

Here I have:

  1. one environment (root)
  2. the environment contain 1..n sys
  3. Each sys contain 1..n models instance with key app-type

Now I need to parse this YAML file so I try to build a struct type like:

type Environment struct {
    Environment [] sys
}

type sys struct{
    Models    []Properties
}

type Models struct{
    app-type     string      `yaml:"app-type"`
    service-type string      `yaml:"service-type"`
}

Now I try to parse this YAML, and I get an error of index out of range.

My questions are:

1. Do I model the YAML correctly?
2. Do I model the struct correctly?

This is the code:

func main() {
    y := Environments{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v
", y)
}

data is the yaml.file.

Try this:

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

type Message struct {
    Environments map[string]models `yaml:"Environments"`
}
type models map[string][]Model
type Model struct {
    AppType     string `yaml:"app-type"`
    ServiceType string `yaml:"service-type"`
}

func main() {
    data := []byte(`
Environments:
 sys1:
    models:
    - app-type: app1
      service-type: fds
    - app-type: app2
      service-type: era
 sys2:
    models:
    - app-type: app1
      service-type: fds
    - app-type: app2
      service-type: era
`)
    y := Message{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v
", y)

}