代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

Golang yaml生成双条目

  •  0
  • Tony The Lion  · 技术社区  · 6 年前

    我想在yaml中生成以下内容:

    - bar: hello
    - bar: another
      pint: guiness
    
    - bar: second
      pint: ""
    

    然而,在Golang中,通过以下示例,我得到以下输出:

    - bar:
      - bar: hello
      - bar: another
      pint: guiness
    - bar:
      - bar: second
      pint: ""
    

    似乎yamlgolang解析器将结构的名称放入它生成的YAML中,就像 - bar: 然后是它下面的成员数组。我不想那样,因为那样会破坏其他东西。

    package main
    
    import (
        "fmt"
        "gopkg.in/yaml.v2"
        "log"
    )
    
    type bar struct {
        Bar string
    }
    
    type foo struct {
        Bars []bar  `yaml:"bar"`
        Pint string `yaml:"pint"`
    }
    
    func main() {
        f := make([]foo, 2)
        f[0].Bars = make([]bar, 2)
        f[0].Bars[0].Bar = "hello"
        f[0].Bars[1].Bar = "another"
        f[0].Pint = "guiness"
        f[1].Bars = make([]bar, 1)
        f[1].Bars[0].Bar = "second"
    
        y, err := yaml.Marshal(f)
        if err != nil {
            log.Fatalf("Marshal: %v", err)
        }
        fmt.Println(string(y))
    }
    

    我想知道是否有办法让它像第一个例子那样生成它?

    即使这意味着我必须使用另一个YAML库。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Miguel    6 年前

    看看这个例子:

    package main
    
    import (
        "fmt"
        "log"
    
        yaml "gopkg.in/yaml.v2"
    )
    
    type T struct {
        Bar  string `yaml:"bar,omitempty"`
        Pint string `yaml:"pint,omitempty"`
    }
    
    func main() {
        var t = make([]T, 3)
        t[0].Bar = "hello"
    
        t[1].Bar = "another"
        t[1].Pint = "guiness"
    
        t[2].Bar = "second"
    
        y, err := yaml.Marshal(t)
        if err != nil {
            log.Fatalf("Marshal: %v", err)
        }
    
        fmt.Println(string(y))
    }
    

    输出:

    - bar: hello
    - bar: another
      pint: guiness
    - bar: second
    

    如果您想在您想要的输出中保持空字符串,那么您可以这样做

    package main
    
    import (
        "fmt"
        "log"
    
        yaml "gopkg.in/yaml.v2"
    )
    
    type S string
    
    func (s *S) IsZero() bool {
        return false
    }
    
    type T struct {
        Bar  string `yaml:"bar,omitempty"`
        Pint *S     `yaml:"pint,omitempty"`
    }
    
    func main() {
        var t = make([]T, 3)
        t[0].Bar = "hello"
    
        t[1].Bar = "another"
        p1 := S("guiness")
        t[1].Pint = &p1
    
        t[2].Bar = "second"
        p2 := S("")
        t[2].Pint = &p2
    
        y, err := yaml.Marshal(t)
        if err != nil {
            log.Fatalf("Marshal: %v", err)
        }
    
        fmt.Println(string(y))
    }
    

    输出:

    - bar: hello
    - bar: another
      pint: guiness
    - bar: second
      pint: ""
    

    有关yaml软件包的更多信息: https://godoc.org/gopkg.in/yaml.v2