【问题标题】:How to iterate over all the YAML values in Golang?如何遍历 Golang 中的所有 YAML 值?
【发布时间】:2016-04-21 09:48:11
【问题描述】:

我正在尝试理解 Golang 中的嵌套地图。我有一个如下图,如何遍历所有键?

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

【问题讨论】:

  • 你想弄清楚 Go 结构应该是什么样子吗?如果没有,你能把它们包括在你的问题中吗?
  • 是的,我在使用 go structs 时遇到了问题。我正在尝试以下逻辑类型 Config struct { foo map[string]string k1 map[string]string k2 []map[string]string } 如果 k2 再次有一个嵌套值它失败了。类似 k2: val2: - val2.1 - val2.2

标签: go


【解决方案1】:

您必须将数据解组到映射 (map[interface{}]interface{}map[string]interface{}) 中,然后您必须检查键值的类型。您可以使用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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多