2016-04-21 3 views
0

Я пытаюсь понять вложенные карты golang. У меня есть карта, как показано ниже, как мне перебирать все ключи?как перебирать все значения yaml в golang

Data: 
    - name: "foo" 
    bar1: 0 
     k1: val1 
     k2: 
     val2 
     val3 
    bar2: 1 
     k3: val4 
     k4: val5 
     k3: val4 
     k4: val5 
+0

Вы пытаетесь выяснить, как выглядят структуры Go? Если нет, можете ли вы включить их в свой вопрос? –

+0

Да, у меня были проблемы с структурами go. Я пытался по указанной ниже логике типа Config { структуры Foo карты [строка] строка k1 карты [строка] строка k2 [] отображение [строка] строка } если k2 снова был вложенное значение было неисправным. что-то вроде k2: val2: - val2.1 - val2.2 – pupil

ответ

0

Вы должны распаковать данные в карту (карта [интерфейс {}] интерфейс {} или карта [строка] интерфейс {}), а затем вы должны проверить тип значения для ключей. Вы можете использовать пакет 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) 
    } 
} 
+0

Спасибо, это помогло – pupil

Смежные вопросы