Вы должны распаковать данные в карту (карта [интерфейс {}] интерфейс {} или карта [строка] интерфейс {}), а затем вы должны проверить тип значения для ключей. Вы можете использовать пакет yaml.v2, и там могут быть более чистые интерфейсы, которые помогают определить тип значений. В противном случае проверьте пример, который выполняет итерации по клавишам и распечатывает значения:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
"reflect"
"strings"
)
var data = `
Data:
- name: "foo"
bar1: 0
k1: val1
k2:
val2
val3
bar2: 1
k3: val4
k4: val5
k5: val5
k6: val6
`
func printVal(v interface{}, depth int) {
typ := reflect.TypeOf(v).Kind()
if typ == reflect.Int || typ == reflect.String {
fmt.Printf("%s%v\n", strings.Repeat(" ", depth), v)
} else if typ == reflect.Slice {
fmt.Printf("\n")
printSlice(v.([]interface{}), depth+1)
} else if typ == reflect.Map {
fmt.Printf("\n")
printMap(v.(map[interface{}]interface{}), depth+1)
}
}
func printMap(m map[interface{}]interface{}, depth int) {
for k, v := range m {
fmt.Printf("%sKey:%s", strings.Repeat(" ", depth), k.(string))
printVal(v, depth+1)
}
}
func printSlice(slc []interface{}, depth int) {
for _, v := range slc {
printVal(v, depth+1)
}
}
func main() {
m := make(map[string]interface{})
err := yaml.Unmarshal([]byte(data), &m)
if err != nil {
panic(err)
}
for k, v := range m {
fmt.Printf("Key:%s ", k)
printVal(v, 1)
}
}
Вы пытаетесь выяснить, как выглядят структуры Go? Если нет, можете ли вы включить их в свой вопрос? –
Да, у меня были проблемы с структурами go. Я пытался по указанной ниже логике типа Config { структуры Foo карты [строка] строка k1 карты [строка] строка k2 [] отображение [строка] строка } если k2 снова был вложенное значение было неисправным. что-то вроде k2: val2: - val2.1 - val2.2 – pupil