gpt4 book ai didi

go - 如何在 Go 和 yaml 包的 API v3 中生成配置文件时对注释进行编码

转载 作者:行者123 更新时间:2023-12-02 21:32:12 24 4
gpt4 key购买 nike

我正在尝试学习使用 YAML v3,同时编码结构来配置 yaml。

注意:更新:我原来的示例有点过于简化。我的实际需求如下:

例如,我有:

package main

import (
"fmt"
"io/ioutil"

"gopkg.in/yaml.v3"
)

type Ec2 struct {
Class string `yaml:"class"`
Ip string `yaml:"ip"`
}

type Vpc struct {
Subnet string `yaml:"subnet"`
Igw interface{} `yaml:"igw"`

}

type Config struct {
Ec2 Ec2 `yaml:"ec2"`
Vpc Vpc `yaml:"vpc"`
}

func main() {
c := Config{}
bytes, err := yaml.Marshal(c)
if err != nil {
fmt.Println(err)
}

ioutil.WriteFile("config.yaml", bytes, 0644)
}

pwd中创建一个名为config.yaml的文件,如下所示:

  ec2:
class: ""
ip: ""
vpc:
subnet: ""
igw: null

但我正在尝试生成配置文件(在本例中为 config.yaml),例如:


ec2:
# This section is for EC2
class: ""
ip: ""
vpc:
# This section is for VPC
subnet: ""
igw: null

使用V.3可以实现这一点吗?

最佳答案

有两种方法可以利用 yaml.v3 及其注释功能:

  • 手动构建 yaml.Node 树(繁琐的维护;精确的值更新)
  • 将模板解析为 yaml.Node 树(易于维护;较难进行值更新)
<小时/>

方法一:

手工制作 YAML 节点树:

config = &yaml.Node{
Kind: yaml.DocumentNode,
Content: []*yaml.Node{
&yaml.Node{
Kind: yaml.MappingNode,
Content: []*yaml.Node{
&yaml.Node{
Kind: yaml.ScalarNode,
Value: "ec2",
HeadComment: "# This section is for EC2",
},
&yaml.Node{
Kind: yaml.ScalarNode,
Style: yaml.DoubleQuotedStyle,
Value: "", // <- field value goes here
},

&yaml.Node{
Kind: yaml.ScalarNode,
Value: "vpc",
HeadComment: "# This section is for VPC",
},
&yaml.Node{
Kind: yaml.ScalarNode,
Style: yaml.DoubleQuotedStyle,
Value: "", // <- field value goes here
},
},
},
},
}

工作 Playground 示例:https://play.golang.org/p/Z6iw29rHZXk

输出:

# This section is for EC2
ec2: ""
# This section is for VPC
vpc: ""
<小时/>

方法2:

读取 YAML 架构的模板,例如

var yamlSchema = []byte(`

# EC2 header-comment
ec2: ""

# This section is for VPC
vpc: ""

`)

然后在运行时将其解析为 yaml.Node 树,如下所示:

var c yaml.Node
err := yaml.Unmarshal(yamlSchema, &c)

但是作为 yaml.Node 树 - 嵌套了 yaml.Node slice - 您需要以编程方式查找字段值,因此当您编码时配置用于写入,值与正确的字段配对。

例如,这个可能今天可以工作:

c.Content[0].Content[1].Value = ec2Value // dangerous

但明天架构发生变化时就不行了。

遍历 map 并查找字段值ec2,然后将其值放入相邻节点将是正确的方法。

Playground example显示如何将页眉/页脚/内联注释添加到架构中,例如

# This section is for EC2
ec2: "" # <-- place user input here
# footer EC2

# This section is for VPC
vpc: ""

关于go - 如何在 Go 和 yaml 包的 API v3 中生成配置文件时对注释进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58510526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com