当我不知道Yaml中的每个可能字段时,如何在go中修改yaml字段?

时间:2019-09-25 17:39:18

标签: go yaml

当我不知道Yaml可能包含的每个字段时,如何修改yaml中的字段?我无法定义具有所有可能字段的结构,并且gopkg.in/yaml.v2 Unmarshall会忽略所提供的结构中没有的字段,因此Marshall会丢失该结构中没有的任何字段,即不可接受。

是否有一个软件包可以让我动态指定一个字段名称,如果该字段存在,该名称将返回基本值或结构,否则返回nil / err?并在保留输入yaml中的所有其他字段的同时编组我的更改吗?

谢谢保罗

2 个答案:

答案 0 :(得分:1)

使用map[interface{}]interface{}进行编组可以解决问题:

            wcc := make(map[interface{}]interface{})
            err := yaml.Unmarshal([]byte(wccString), &wcc)

(对我而言)访问yaml结构的符号不直观,但最终我确实找到了一个可行的咒语:

wcc["extensions"].(map[interface{}]interface{})["scriptURLs"].([]interface{})[2] = "https://192.168.0.3:8080/..."

答案 1 :(得分:0)

根据您的答案猜测YAML的外观,也许这样可以工作:

//
// a map (string index) of map (string index) of a string slice
//
type mystruct map[string]map[string][]string

//
// guessing what your YAML looks like:
//
wccYAML = `
extensions:
  scriptURLs:
    - 'https://localhost:9000'
    - 'https://localhost:9001'
    - 'https://localhost:9002'
`

游乐场:https://play.golang.org/p/wvkr2pFk-0j

通常您都希望避免使用interface{},因为您已经看到转换很快就会变得混乱。