【问题标题】:Golang yaml generation double entriesGolang yaml 生成双条目
【发布时间】:2018-12-13 14:47:39
【问题描述】:

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

- bar: hello
- bar: another
  pint: guiness

- bar: second
  pint: ""

在 Golang 中,但是以下面的示例为例,我得到以下输出:

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

YAML Golang 解析器似乎将结构的名称放在它生成的 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 库。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码in问题本身
  • foo.Bars 应该是字符串,而不是切片。
  • @Peter 我想要一个 bar 结构数组。这是一个简化的示例,但本质上我需要一个结构数组,并且真的希望它不要打印外部结构名称。
  • 这不是您在所需输出中显示的内容。那里的栏字段是字符串。

标签: parsing go yaml


【解决方案1】:

看看这个例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多