Golang Yaml生成两次输入

时间:2018-12-13 14:47:39

标签: parsing go yaml

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

rom PyQt5.QtWidgets import *

在Golang中,但是进行以下示例,我得到以下输出:

- bar: hello
- bar: another
  pint: guiness

- bar: second
  pint: ""

似乎YAML Golang解析器将结构名放在它生成的YAML中,例如- bar: - bar: hello - bar: another pint: guiness - bar: - bar: second pint: "" ,然后在其下放置成员数组。我不想要那样,因为它会破坏其他东西。

- bar:

我想知道是否有一种方法可以像第一个示例那样生成它?

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

1 个答案:

答案 0 :(得分:0)

看看这个例子:

talent_ability: talent_abilities.pluck(:name).join(' ')

输出:

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))
}

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