在Go YAML中,如何编排换行符?

huangapple go评论92阅读模式
英文:

How do you marshal a line break in Go YAML?

问题

在我编写的golang CLI中,我收集了有关如何配置工具的信息,并将其作为YAML文件进行了编组。然而,我不确定如何添加换行符以使文件更易读?

type Config struct {
	Author      string `yaml:"author"`
	License     string `yaml:"license"`
	// 在这里添加一个换行符
	Workspace   string `yaml:"workspace"`
	Description string `yaml:"description"`
	// 在这里添加一个换行符
	Target      string `yaml:"target"`
}
英文:

In a golang CLI I'm programming I collect information on how to configure the tool and I marhsal that as a YAML file. However, I'm not sure how I would add line breaks to make the file more readable?

type Config struct {
	Author  string `yaml:"author"`
	License string `yaml:"license"`
	// Marhsal a line break here
	Workspace   string `yaml:"workspace"`
	Description string `yaml:"description"`
	// Marhsal a line break here
	Target string `yaml:"target"`
}

答案1

得分: 2

一种实现这个的方法是使用模板引擎,这样可以允许格式化(和注释)。

下面是一个运行示例,它生成一个包含格式化的yaml的字符串,然后可以保存到一个.yml文件中。

不需要额外的库,模板包含在go文件中。

package main

import (
	"bytes"
	"fmt"
	"text/template"
)

type Config struct {
	Author      string
	License     string
	Workspace   string
	Description string
	Target      string
}

const cfg_template = `
conf:
	author: {{ .Author }}
	licence: {{ .License }}

	workspace: {{ .Workspace }}
	description: {{ .Description }}

	# you can even add comments to the template
	target: {{ .Target }}

	# other hardcoded config
	foo: bar
`

func generate(config *Config) string {
	t, err := template.New("my yaml generator").Parse(cfg_template)

	if err != nil {
		panic(err)
	}

	buf := &bytes.Buffer{}
	err = t.Execute(buf, config)

	if err != nil {
		panic(err)
	}

	return buf.String()
}

func main() {
	c := Config{
		Author:      "Germanio",
		License:     "MIT",
		Workspace:   "/home/germanio/workspace",
		Description: "a cool description",
		Target:      "/home/germanio/target",
	}
	yaml := generate(&c)

	fmt.Printf("yaml:\n%s", yaml)
}

结果如下所示:

$ go run yaml_generator.go 
yaml:

conf:
        author: Germanio
        licence: MIT

        workspace: /home/germanio/workspace
        description: a cool description

        # you can even add comments to the template
        target: /home/germanio/target

        # other hardcoded config
        foo: bar

我相信有更好的实现方法,只是想展示一个快速可行的示例。

英文:

One way to implement this that allows format (and comments) is to use a template engine.

Here is a running example that generates a string with the formatted yaml, that can be then saved to a .yml file.

No additional libraries are needed and the template is included inside the go file.

package main

import (
	"bytes"
	"fmt"
	"text/template"
)

type Config struct {
	Author      string
	License     string
	Workspace   string
	Description string
	Target      string
}

const cfg_template = `
conf:
	author: {{ .Author }}
	licence: {{ .License }}

	workspace: {{ .Workspace }}
	description: {{ .Description }}

	# you can even add comments to the template
	target: {{ .Target }}

	# other hardcoded config
	foo: bar

`

func generate(config *Config) string {
	t, err := template.New("my yaml generator").Parse(cfg_template)

	if err != nil {
		panic(err)
	}

	buf := &bytes.Buffer{}
	err = t.Execute(buf, config)

	if err != nil {
		panic(err)
	}

	return buf.String()
}

func main() {
	c := Config{
		Author:      "Germanio",
		License:     "MIT",
		Workspace:   "/home/germanio/workspace",
		Description: "a cool description",
		Target:      "/home/germanio/target",
	}
	yaml := generate(&c)

	fmt.Printf("yaml:\n%s", yaml)
}

The result looks like this:

$ go run yaml_generator.go 
yaml:

conf:
        author: Germanio
        licence: MIT

        workspace: /home/germanio/workspace
        description: a cool description

        # you can even add comments to the template
        target: /home/germanio/target

        # other hardcoded config
        foo: bar

I'm sure there are better ways to implement it, just want to show a quick working example.

答案2

得分: 1

由于空行在 YAML 中没有意义,因此默认库不会创建它们,并且在结构字段标签中也没有暴露选项来执行此操作。

然而,如果你想对类型在 YAML 中的编组方式进行精细控制,你可以通过定义一个方法 MarshalYAML() (interface{}, error) 来使其实现 yaml.Marshaller 接口。

英文:

As empty line don't have a meaning in yaml, the default library does not create them, and does not expose an option to do so in the struct field tag.

However, if you want fine grained control of how a type is marshalled in yaml, you can always make it implements yaml.Marshaller by defining a method MarshalYAML() (interface{}, error)

huangapple
  • 本文由 发表于 2021年5月20日 21:41:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/67621557.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定