【问题标题】:Issue Marshaling YAML with an array of struct使用结构数组发出编组 YAML
【发布时间】:2021-12-28 22:49:54
【问题描述】:

我希望生成的 yaml 文件包含正在写入为空对象的服务器数组。我该如何解决这个问题,以便将服务器数组写入 yaml 文件?

代码:

package configwritter

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2" //go get gopkg.in/yaml.v2
)

type Server struct {
    name string `yaml:"name"`
    ip   string `yaml:"ip"`
}

type Confugration struct {
    Name    string
    Servers []Server
}

func WriteConfig() {
    config := Confugration{
        Name: "Test",
        Servers: []Server{
            {"server1", "10.0.0.100"},
            {"server1", "10.0.0.101"},
        },
    }

    data, err := yaml.Marshal(&config)
    if err != nil {
        log.Fatal(err)
    }

    err2 := ioutil.WriteFile("config.yaml", data, 0)
    if err2 != nil {
        log.Fatal(err2)
    }

    fmt.Println("data written")
}

输出:

name: Test
servers:
- {}
- {}

【问题讨论】:

    标签: go yaml marshalling


    【解决方案1】:

    您的 Server 结构上的字段似乎需要公开,以便 yaml 模块读取它们。

    来自Marshal documentation

    结构字段仅在导出时才被编组(首字母大写)

    您可以通过更改 Server 的类型定义来解决此问题,以便导出字段(具有大写名称),如下所示:

    type Server struct {
        Name string `yaml:"name"`
        IP   string `yaml:"ip"`
    }
    

    输出config.yaml文件:

    name: Test
    servers:
    - name: server1
      ip: 10.0.0.100
    - name: server1
      ip: 10.0.0.101
    

    【讨论】:

    • 一般情况下,@talkersoft 将任何非结构“内部”的字段名称大写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多