【问题标题】:Go Yaml Interpretation ExampleGo Yaml 解释示例
【发布时间】:2015-06-15 04:27:53
【问题描述】:

这个 Go Yaml 解释示例, https://gist.github.com/suntong001/74c85d15b19ef4b14b0e,可以像这样解组一个简单的 YAML:

foo: 1
bar:
  - one
  - two

现在我想解释一个完全相同的数据结构的数组,正确的做法是什么?

以下是我目前的代码,它没有按预期工作。请帮忙。

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

type Config struct {
    Foo string
    Bar []string
}

type Configs struct {
    Cfgs []Config
}

var data = `
- foo: 1
  bar:
    - one
    - two
    - three
- foo: 2
  bar:
    - one1
    - two2
    - three3
`

func main() {

  var config Configs

    /*
       filename := os.Args[1]
       source, err := ioutil.ReadFile(filename)
       if err != nil {
           panic(err)
       }
    */

    source := []byte(data)

    err := yaml.Unmarshal(source, &config)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

    //fmt.Printf("Value: %#v\n", config.Bar[0])

    fmt.Printf("--- config:\n%v\n\n", config)
}

更新:

Jfly 指出,要使其正常工作,只需将我的 var config Configs 替换为 var config []Config,就可以了。现在我认为如果将我的数据定义更改为以下内容,我的上述代码将起作用。

foobars:
 - foo: 1
   bar:
    - one
    - two
    - three

 - foo: 2
   bar:
    - one1
    - two2
    - three3

不,它没有。请帮忙。

【问题讨论】:

    标签: go yaml


    【解决方案1】:

    示例 yaml 文件的内容是对象序列,所以这样做:

    package main
    
    import (
        "fmt"
        "log"
    
        "gopkg.in/yaml.v2"
    )
    
    type Config struct {
        Foo string
        Bar []string
    }
    
    var data = `
    - foo: 1
      bar:
        - one
        - two
        - three
    - foo: 2
      bar:
        - one1
        - two2
        - three3
    `
    
    func main() {
    
        var config []Config
    
        /*
           filename := os.Args[1]
           source, err := ioutil.ReadFile(filename)
           if err != nil {
               panic(err)
           }
        */
    
        source := []byte(data)
    
        err := yaml.Unmarshal(source, &config)
        if err != nil {
            log.Fatalf("error: %v", err)
        }
    
        //fmt.Printf("Value: %#v\n", config.Bar[0])
    
        fmt.Printf("--- config:\n%v\n\n", config)
    }
    

    至于您更新的问题,您的代码几乎可以正常工作,只需向 yaml 解析器提示如下:

    type Configs struct {
        Cfgs []Config `foobars`
    }
    

    【讨论】:

    • 是的,这行得通,但我仍然想知道为什么。我认为var config []Config 与我的var config Configs 相同,它的类型为[]Config,不是吗?有什么不同?谢谢。
    • 不,不一样。 var config Configs 表示mapping scalars to sequences
    • 嗯...我还是不太明白。这么说吧,如果我需要将这个数组合并到一个更复杂的数据结构中怎么办?我已经更新了我的数据 def 以反映嵌套它的最简单方法,我认为我的代码可以工作,但我又错了。请帮忙。
    • @xpt 查看我的编辑,如果对您有帮助,请点赞答案:-)
    • 当然,正在等待关闭。绝对+1。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2014-11-20
    • 2016-06-01
    • 2015-05-14
    • 2018-06-14
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多