You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go使用yaml.v2序列化结构体数组输出为空对象如何解决

问题根因

Go语言的访问控制规则规定,只有首字母大写的公开导出字段才能被外部库通过反射访问。gopkg.in/yaml.v2序列化依赖反射读取结构体字段值,你定义的Server结构体中name、ip字段均为首字母小写的私有字段,yaml库无法读取到对应值,因此序列化后得到空对象。

修复步骤
  1. 将Server结构体的两个字段首字母改为大写,保持yaml标签不变即可保证序列化后yaml的key仍为小写格式
  2. (可选)修正Confugration的拼写错误为Configuration,不影响运行仅为代码规范
  3. (建议)修改文件写入权限为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:36:06