
go 的 `json.marshal` 只能序列化导出(首字母大写)字段;未导出字段(小写开头)会被忽略,导致序列化结果为空对象 `{}`。
在 Go 语言中,JSON 序列化依赖于反射机制,而反射仅能访问导出(exported)字段——即字段名以大写字母开头的成员。你代码中的 Configitem 和 GuiConfig 结构体所有字段均以小写字母开头(如 local_address、configs),因此 json.Marshal 无法读取它们的值,最终输出空 JSON 对象 {}。
✅ 正确做法是将结构体字段改为导出字段,并可选地通过 json 标签控制键名:
type Configitem struct {
LocalAddress string `json:"local_address"`
LocalPort int `json:"local_port"`
Method string `json:"method"`
Password string `json:"password"`
Server string `json:"server"`
ServerPort string `json:"server_port"`
Timeout int `json:"timeout"`
}
type GuiConfig struct {
Configs []*Configitem `json:"configs"`
Index int `json:"index"`
}修改后,原 main 函数无需改动,即可正确输出:
{"configs":[{"local_address":"eouoeu","local_port":111,"method":"eoeoue","password":"ouoeu","server":"oeuoeu","server_port":"qoeueo","timeout":3333}],"index":1}⚠️ 注意事项:
- 字段名大小写决定是否可被 encoding/json 访问,与 json 标签无关;
- 若因封装需求必须保留私有字段,可手动实现 json.Marshaler 接口,自定义序列化逻辑(需谨慎维护一致性);
- 建议统一使用驼峰命名 + json 标签,兼顾 Go 风格与 API 兼容性(如 LocalAddress → "local_address")。
总结:Go 的 JSON 序列化遵循严格的可见性规则——只有导出字段才能被序列化。修正字段首字母大小写是最简单、标准且推荐的解决方式。










