я пытаюсь разобрать следующий yaml, и я получил ошибку, yaml действителен в соответствии с https://codebeautify.org/yaml-validator/cb4510d0
Я пытаюсь использовать интерфейс и до сих пор не могу разобрать файл.
что мне нужно это:
- выведите значения как
runner1
runner2
и runner3
- значения cmd
есть идеи, почему интерфейс не работает в этом случае?
ошибка:
2019/03/19 22:42:11 Error : yaml: unmarshal errors:
line 6: cannot unmarshal !!seq into map[string]interface {}
line 22: cannot unmarshal !!seq into map[string]interface {}
это то, что я пытался
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
var runContent = []byte(`
version: "1.1"
run-parameters:
before:
- runner: runner1
options:
cmd:
- value1
- value2
supported: k8s
- runner: runner2
options:
cmd:
- value3
- value4
supported: aws
after:
- runner: runner3
options:
cmd:
- value6
- value7
supported: aws
`)
type FTD struct {
Version string `yaml:"version,omitempty"`
BuildParams *RunParams `yaml:"run-parameters,omitempty"`
}
type RunParams struct {
BeforeExec map[string]interface{} `yaml:"before,omitempty"`
AfterExec map[string]interface{} `yaml:"after,omitempty"`
}
func main() {
runners := &FTD{}
// parse mta yaml
err := yaml.Unmarshal(runContent, runners)
if err != nil {
log.Fatalf("Error : %v", err)
}
// for _, v := range runners.BuildParams.BeforeExec {
// fmt.Printf("%#v\n", v)
// }
// fmt.Println(runners.BuildParams.BeforeExec["run-parameters"])
// if _, ok := runners.BuildParams.BeforeExec["run-parameters"]; ok {
// run := runners.BuildParams.BeforeExec["run-parameters"].(map[interface{}]interface{})["run"]
// fmt.Println("run: ", run)
// }
runParams, ok := runners.BuildParams.BeforeExec["run-parameters"]
if !ok {
// handle lack of "run-parameters" in BeforeExec
}
runParamsMap, ok := runParams.(map[interface{}]interface{})
if !ok {
// handle "run-parameters" not being a map
}
run, ok := runParamsMap["run"]
if !ok {
// handle lack of "run" inside "run-parameters"
}
runStr, ok := run.(string)
if !ok {
// handle "run" not being a string
}
fmt.Println("run: ", runStr)
}