【问题标题】:How do I modify a yaml field in go when I don't know every possible field in the yaml?当我不知道 yaml 中的每个可能字段时,如何在 go 中修改 yaml 字段?
【发布时间】:2020-01-25 23:14:39
【问题描述】:

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

是否有一个包允许我动态指定一个字段名称,如果该字段存在则返回基本值或结构,否则返回 nil/err?并整理我的更改,同时保留输入 yaml 中的所有其他字段?

谢谢,保罗

【问题讨论】:

  • 如果您不提前知道密钥,请使用map
  • 谢谢。您能否指出任何保留任意复杂 yaml 的示例?我见过的示例具有特定 yaml 的特定映射。这与 Kubernetes 尤其相关,其中核心编程技术是获取资源 yaml(通常很复杂,通常记录不充分),更新一些字段,然后应用修改后的 yaml。我正在移植当前在 Javascript 中实现的功能(将 yaml 转换为 JSON),其中动态访问字段并保留所有输入字段只是内置于语言中。我正在尝试整合一些 bash 和 javascript。
  • 这是YAML-to-go generator 是一个很好的在线资源,用于在给定示例输入YAML 的情况下构建go 兼容结构。
  • 我刚刚根据我认为您的源 YAML 的样子发布了一个答案...

标签: go yaml


【解决方案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/..."

【讨论】:

    【解决方案2】:

    根据你的回答猜测你的 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{},因为您已经看到铸件很快就会变得一团糟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多