Go使用yaml.v2序列化结构体数组输出为空对象如何解决
问题根因
Go语言的访问控制规则规定,只有首字母大写的公开导出字段才能被外部库通过反射访问。gopkg.in/yaml.v2序列化依赖反射读取结构体字段值,你定义的Server结构体中name、ip字段均为首字母小写的私有字段,yaml库无法读取到对应值,因此序列化后得到空对象。
修复步骤
- 将
Server结构体的两个字段首字母改为大写,保持yaml标签不变即可保证序列化后yaml的key仍为小写格式 - (可选)修正
Confugration的拼写错误为Configuration,不影响运行仅为代码规范 - (建议)修改文件写入权限为0644,避免后续读取配置时出现权限不足问题
修复后完整代码
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 Configuration struct { // 此处为可选的拼写修正 Name string Servers []Server } func WriteConfig() { config := Configuration{ 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, 0644) if err2 != nil { log.Fatal(err2) } fmt.Println("data written") }
序列化后预期输出
name: Test servers: - name: server1 ip: 10.0.0.100 - name: server1 ip: 10.0.0.101
内容的提问来源于stack exchange,提问作者talkersoft
相关产品推荐
相关产品推荐

