我有一个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中执行此操作?
谢谢
如果您现在不精确的结构,则应该使您的结构看起来像这样
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/,但是每次出现新的键/值对时,您都需要添加新对象。