
本文详解如何使用 Go 语言初始化嵌套结构体、填充切片字段,并通过 json.MarshalIndent 生成格式化 JSON 输出,涵盖结构体标签设置、字面量初始化和常见注意事项。
本文详解如何使用 go 语言初始化嵌套结构体、填充切片字段,并通过 json.marshalindent 生成格式化 json 输出,涵盖结构体标签设置、字面量初始化和常见注意事项。
在 Go 中向结构体(如 Species)填充数据,关键在于理解结构体字面量(struct literal) 和 切片字面量(slice literal) 的组合用法。你无需先声明空变量再逐个赋值,而是可以直接使用复合字面量一次性完成初始化。
首先,需为结构体字段添加 JSON 标签(如 `json:"human"`),否则默认导出字段名(Human)将作为 JSON 键名,与预期的 "human" 不符。同时,嵌套的 Info 结构体也需标注 name 和 number 字段,确保序列化结果符合目标格式。
以下是完整可运行示例:
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 {
fmt.Println("JSON 序列化失败:", err)
return
}
fmt.Println(string(b))
}
✅ 输出结果完全匹配你的预期 JSON 结构(含缩进):
{
"human": [
{
"name": "dave",
"number": "00001"
},
{
"name": "jack",
"number": "00002"
},
{
"name": "nate",
"number": "00003"
}
],
"animal": [
{
"name": "ko",
"number": "00004"
},
{
"name": "na",
"number": "00005"
}
]
}
⚠️ 注意事项:
- 字段必须是大写首字母(导出),否则
json包无法访问; -
json标签中的键名区分大小写,且不支持空格或特殊字符; - 若某切片字段暂无数据,可初始化为空切片(如
Human: []Info{}),而非nil(二者在 JSON 中均序列化为[],但空切片更安全); - 使用
json.MarshalIndent而非json.Marshal可提升可读性,便于调试; - 实际项目中建议对
err进行健壮处理(如日志记录或返回错误),不可忽略。
掌握这种结构体 + 切片 + JSON 标签的组合模式,是 Go 中构建 API 响应、配置解析和数据持久化的基础能力。











