小编典典

解析动态Yaml文件

go

我有一个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)

            }

在上面的示例中,它仅适用于密钥/狗密钥,而不适用于其他密钥。

当新值经常添加到yaml文件中时,如何在Go中执行此操作?

谢谢


阅读 734

收藏
2020-07-02

共1个答案

小编典典

如果您现在不精确的结构,则应该使您的结构看起来像这样

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

它将解析整个yaml并获取所有值,但这将是一个数组,因此您将失去对对象的类型提示。另一种方法是提前终止https://blog.gopheracademy.com/advent-2016/advanced-
encoding-decoding/,但是每次出现新的键/值对时,您都需要添加新对象。

2020-07-02