当我不知道Yaml可能包含的每个字段时,如何修改yaml中的字段?我无法定义具有所有可能字段的结构,并且gopkg.in/yaml.v2
Unmarshall
会忽略所提供的结构中没有的字段,因此Marshall
会丢失该结构中没有的任何字段,即不可接受。
是否有一个软件包可以让我动态指定一个字段名称,如果该字段存在,该名称将返回基本值或结构,否则返回nil / err?并在保留输入yaml中的所有其他字段的同时编组我的更改吗?
谢谢保罗
答案 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{}
,因为您已经看到转换很快就会变得混乱。