使用结构数组发出封送处理 YAML

Issue Marshaling YAML with an array of struct

我期望生成的 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:
- {}
- {}

您的 Server 结构中的字段似乎需要 public 才能让 yaml 模块读取它们。

来自Marshal documentation

Struct fields are only marshalled if they are exported (have an upper case first letter)

您可以通过更改 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