使用结构数组发出封送处理 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
模块读取它们。
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
我期望生成的 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
模块读取它们。
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