解析动态yaml文件

时间:2018-02-24 08:40:01

标签: go yaml

我有一个yaml文件,目前写成:

    keys:
        - key: secret/dog
          values:
            - username: shiba
            - password: inu
        - key: secret/cat
          values:
            - dbhost: localhost
            - words: meow

但是,此yaml文件经常更改,因此每次都可以添加不同值的新条目:

    keys:
        - key: secret/dog
          values:
            - username: shiba
            - password: inu
        - key: secret/cat
          values:
            - dbhost: localhost
            - words: meow
        - key: secret/mouse
          values:
            - color: white
        - key: secret/clouds
          values:
            - type: fluffy

我知道从使用gopkg.in/yaml.v2包,我可以解析yaml文件,如果所有值都相同,例如:

            type Secrets struct {
                Keys []struct {
                    Key    string `json:"key"`
                    Values []struct {
                        Username string `json:"username"`
                        Password string `json:"password"`
                    } `json:"values"`
                } `json:"keys"`
            }

            func main() {

                var secret Secrets
                reader, err := os.Open("demo.yml")
                if err != nil {
                    log.Fatal(err)
                }
                buf, _ := ioutil.ReadAll(reader)
                yaml.Unmarshal(buf, &secret)

                fmt.Printf("%+v\n", secret.Keys[1].Key)

            }

在上面的例子中,它只适用于secret / dog键,但不适用于其他键。

如果经常将新值添加到我的yaml文件中,如何在Go中执行此操作?

由于

1 个答案:

答案 0 :(得分:1)

如果你现在没有确切的结构,你应该让你的结构看起来像这样

type Secrets struct {
    Keys []struct {
        Key    string `json:"key"`
        Values []map[string]string `json:"values"`
    } `json:"keys"`
}

它将解析你的整个yaml并获取所有值,但它将是一个数组,因此你会丢失对象的类型提示。其他方式arround将是提前编码https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/但是每次出现新的键/值对时都需要添加新对象。