Golang Yaml поколения двойных записей - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу сгенерировать следующее в yaml:

- bar: hello
- bar: another
  pint: guiness

- bar: second
  pint: ""

в Golang, однако, сделав следующий пример, я получаю вывод ниже:

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

Кажется, YAML Golangparser помещает имена структур в 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 Ответ

0 голосов
/ 19 декабря 2018

Посмотрите на этот пример:

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

...