
本文详解如何在 go 中初始化嵌套结构体、为字段赋值,并通过 json.marshalindent 生成格式化 json,包括结构体标签设置、切片初始化和常见注意事项。
本文详解如何在 go 中初始化嵌套结构体、为字段赋值,并通过 json.marshalindent 生成格式化 json,包括结构体标签设置、切片初始化和常见注意事项。
在 Go 中向结构体(struct)填充数据,关键在于理解结构体字面量(struct literal)的语法以及切片([]Info)的初始化方式。你原代码中 data = ???? 的位置,应使用复合字面量直接构造 Species 实例,并为每个字段(Human 和 Animal)提供已初始化的 []Info 切片。
首先,需为 JSON 序列化添加结构体标签(field tags),确保导出字段名与期望的 JSON 键名一致(如 "human" 而非 "Human")。注意:Go 中只有首字母大写的字段才是可导出的(即能被 encoding/json 包访问),因此 Human 和 Animal 必须大写,但通过 `json:"human"` 标签可控制输出键名小写。
以下是完整可运行示例:
package main
import (
"encoding/json"
"fmt"
)
type Species struct {
Human []Info `json:"human"`
Animal []Info `json:"animal"`
}
type Info struct {
Name string `json:"name"`
Number string `json:"number"`
}
func main() {
data := Species{
Human: []Info{
{Name: "dave", Number: "00001"},
{Name: "jack", Number: "00002"},
{Name: "nate", Number: "00003"},
},
Animal: []Info{
{Name: "ko", Number: "00004"},
{Name: "na", Number: "00005"},
},
}
b, err := json.MarshalIndent(data, "", " ")
if err != nil {
panic(err) // 或使用 fmt.Println("error:", err)
}
fmt.Println(string(b))
}
✅ 关键要点说明:
- 结构体字段必须首字母大写(
Human,Animal,Name,Number)才能被json包序列化; - 使用
`json:"xxx"`标签精确控制 JSON 键名大小写与是否忽略空值(如`json:"name,omitempty"`); - 初始化切片时,直接使用
{}构造每个Info元素,字段名可省略(因顺序明确)或显式写出(推荐,更清晰可维护); -
json.MarshalIndent第二个参数为前缀(空字符串表示无前缀),第三个参数为每级缩进(此处为两个空格),便于调试和阅读; - 若字段可能为空,建议添加
omitempty标签避免冗余键;若需处理nil切片(如未初始化的[]Info),json包默认输出null,可预先初始化为[]Info{}避免。
运行该程序将输出完全符合你预期的格式化 JSON —— 层次清晰、键名准确、缩进规范,是构建 API 响应或配置序列化的标准实践。











