本文介绍在 Go 中如何便捷地打印结构体所有导出字段的名称和对应值,解决 JSON 反序列化后快速调试或日志输出的需求,核心方法是使用 fmt.Printf("%+v", struct) 配合正确导出的字段。
本文介绍在 go 中如何便捷地打印结构体所有导出字段的名称和对应值,解决 json 反序列化后快速调试或日志输出的需求,核心方法是使用 `fmt.printf("%+v", struct)` 配合正确导出的字段。
在 Go 中,若希望以可读方式一次性输出结构体全部字段名与值(如 Field1:"en" Field2:120 Field3:2024-01-01 10:00:00 +0000 UTC),关键有两点:字段必须导出(首字母大写),且需使用支持结构体字段名显示的格式化动词。
首先,修正原始结构体定义——Go 的 JSON 解码器(json.Unmarshal)完全忽略非导出字段(小写首字母),因此 field1、field2 等均无法被反序列化,更无法参与后续打印。正确写法应为:
type Content struct {
Field1 string `json:"Language"`
Field2 int `json:"Runtime"`
Field3 time.Time `json:"StartTime"`
Field4 time.Time `json:"EndTime"`
Field5 int64 `json:"ProgramId"`
Field6 string `json:"ProviderId"`
Field7 string `json:"Title"`
}
⚠️ 注意:除首字母大写外,还需检查 JSON tag 拼写(如原题中 "ProgramId 缺少右引号、"Title: 多了冒号),否则反序列化会静默失败或填充零值。
完成结构体定义后,无需手动遍历字段,直接使用 fmt.Printf 的 %+v 动词即可输出带字段名的完整结构体内容:
var c Content
err := json.Unmarshal(data, &c)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", c) // 输出示例:{Field1:"English" Field2:95 Field3:2024-01-01 08:00:00 +0000 UTC ...}
%+v 是 fmt 包提供的“详细结构体格式化”动词:它自动列出每个导出字段的名称与值,对 time.Time、struct、slice 等复杂类型也保持可读性,是开发调试与日志记录的高效选择。
补充说明:若需自定义输出格式(如 field1:value 形式),可借助反射(reflect 包)实现通用遍历,但对绝大多数场景而言,%+v 已足够简洁、安全且性能优异——无需引入额外依赖,也避免了反射带来的运行时开销与维护成本。











