Map 使用接口动态映射YAML的更简单方法?

Map 使用接口动态映射YAML的更简单方法?,map,go,yaml,Map,Go,Yaml,我试图动态解析yaml文件(因此没有结构) 每次我必须访问子键时,我都被迫将相关的map变量转换为(map[interface{}]interface{})。这给我带来了一点麻烦,因为我必须遍历地图 有没有更简单的方法来解析Go中的YAML文件?另一种方法是将YAML数据结构扁平化为键和值映射,其中键和值是字符串。然后,如果您需要实际的类型(5是一个int),您可以自己进行转换。例如: "a" = "First!" "f" = "Second" "b.c.f" = "Third" "b.c.g.

我试图动态解析yaml文件(因此没有结构)

每次我必须访问子键时,我都被迫将相关的map变量转换为(map[interface{}]interface{})。这给我带来了一点麻烦,因为我必须遍历地图


有没有更简单的方法来解析Go中的YAML文件?

另一种方法是将YAML数据结构扁平化为键和值映射,其中键和值是字符串。然后,如果您需要实际的类型(5是一个int),您可以自己进行转换。例如:

"a" = "First!"
"f" = "Second"
"b.c.f" = "Third"
"b.c.g.size" = "2"
"b.c.g.0 = "zero"
"b.c.g.1 = "one" 
围棋:

func main() {
    any := map[string]interface{}{}
    err := yaml.Unmarshal([]byte(out), &any)
    if err != nil {
        log.Fatal(err)
    }

    flatmap := map[string]string{}
    for k, v := range any {
        flatten(k, v, flatmap)
    }

    for k, v := range flatmap {
        fmt.Println(k, "=", v)
    }
}

func flatten(prefix string, value interface{}, flatmap map[string]string) {
    submap, ok := value.(map[interface{}]interface{})
    if ok {
        for k, v := range submap {
            flatten(prefix+"."+k.(string), v, flatmap)
        }
        return
    }
    stringlist, ok := value.([]interface{})
    if ok {
        flatten(fmt.Sprintf("%s.size", prefix), len(stringlist), flatmap)
        for i, v := range stringlist {
            flatten(fmt.Sprintf("%s.%d", prefix, i), v, flatmap)
        }
        return
    }
    flatmap[prefix] = fmt.Sprintf("%v", value)
}

我不知道这个特定的库,但通过在JSON和XML中执行相同的操作,最简单的方法是反序列化一个比泛型字典更严格类型的结构。严格来说,没有结构。。返回结构是不可预测的。您至少可以假设键总是字符串吗?您至少可以使用
map[string]interface{}
并减少强制转换。但它仍然不优雅。我可以这样索引它吗。。m[“b”][“c”]?
func main() {
    any := map[string]interface{}{}
    err := yaml.Unmarshal([]byte(out), &any)
    if err != nil {
        log.Fatal(err)
    }

    flatmap := map[string]string{}
    for k, v := range any {
        flatten(k, v, flatmap)
    }

    for k, v := range flatmap {
        fmt.Println(k, "=", v)
    }
}

func flatten(prefix string, value interface{}, flatmap map[string]string) {
    submap, ok := value.(map[interface{}]interface{})
    if ok {
        for k, v := range submap {
            flatten(prefix+"."+k.(string), v, flatmap)
        }
        return
    }
    stringlist, ok := value.([]interface{})
    if ok {
        flatten(fmt.Sprintf("%s.size", prefix), len(stringlist), flatmap)
        for i, v := range stringlist {
            flatten(fmt.Sprintf("%s.%d", prefix, i), v, flatmap)
        }
        return
    }
    flatmap[prefix] = fmt.Sprintf("%v", value)
}