gpt4 book ai didi

go - 如何通过代码向yaml文件添加新条目

转载 作者:行者123 更新时间:2023-12-05 03:17:44 25 4
gpt4 key购买 nike

我有 yaml 文件,我需要使用 go 代码在运行时向其中添加数据路径如下,我是说

这是在 snk_devsif 下有一个条目的 yaml 文件

spec:
mec:
tolerations:
- effect: NoSchedule
key: WorkGroup
operator: Equal
value: goxy
resources:
requests:
cpu: 100m
memory: 1Gi
customConfig:
sif:
prom_exporter:
type: prometheus_exporter
snk_dev:
type: sk_hc_logs
inputs:
- tesslt
ep: ${NT}
dken: ${SN}
encoding:
codec: "json"
index: us
compression: gzip
buffer:
type: memory

在下面的yaml路径下我需要添加一个新条目

spec->mec->customConfig->sif 一个新条目 snd_prd

    snk_prod:   
type: sk_hc_logs
inputs:
- tesslt
ep: ${NT}
dken: ${SN}
encoding:
codec: "json"
index: us
compression: gzip
buffer:
type: memory

我们正在使用 kustomize,我想知道是否有一种方法可以通过代码来完成,我的意思是提前选择我需要添加的文件并在运行时添加它或者使用 https://github.com/go-yaml/yaml

可能更好

最佳答案

Yaml 编解码器支持解码为 map[string]any 并将此类映射编码为 yaml。

想法是解码文档和额外的树,然后将额外的 map 放在所需路径下,然后编码回来。

type YamlObject map[string]any

func main() {
// Parse the initial document
doc := make(YamlObject)
yaml.Unmarshal([]byte(document), &doc)
// Parse the additional nodes
addon := make(YamlObject)
yaml.Unmarshal([]byte(extra), &addon)
// Find the node by the path
node := findChild(doc, "spec", "mec", "customConfig", "sif")
if node == nil {
panic("Must not happen")
}
// Add the keys from the additional document
// under the specified path
for key, val := range addon {
(*node)[key] = val
}
// Output the modified document
outDoc, _ := yaml.Marshal(doc)
println(string(outDoc))
}

func findChild(obj YamlObject, path ...string) *YamlObject {
if len(path) == 0 {
return &obj
}
key := path[0]
child, ok := obj[key]
if !ok {
return nil
}
obj, ok = child.(YamlObject)
if !ok {
return nil
}
return findChild(obj, path[1:]...)
}

完整示例 https://go.dev/play/p/pTdXR53p0mq

输出:

spec:
mec:
customConfig:
sif:
prom_exporter:
type: prometheus_exporter
snk_dev:
buffer:
type: memory
compression: gzip
dken: ${SN}
encoding:
codec: json
ep: ${NT}
index: us
inputs:
- tesslt
type: sk_hc_logs
snk_prod:
buffer:
type: memory
compression: gzip
dken: ${SN}
encoding:
codec: json
ep: ${NT}
index: us
inputs:
- tesslt
type: sk_hc_logs
resources:
requests:
cpu: 100m
memory: 1Gi
tolerations:
- effect: NoSchedule
key: WorkGroup
operator: Equal
value: goxy

YAML 编解码器按字母顺序输出键

关于go - 如何通过代码向yaml文件添加新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74004588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com