
本文详解如何使用字面量语法为嵌套结构体(含切片字段)初始化数据,并通过 json.MarshalIndent 输出格式化 JSON,同时说明结构体标签对字段名映射的关键作用。
本文详解如何使用字面量语法为嵌套结构体(含切片字段)初始化数据,并通过 `json.marshalindent` 输出格式化 json,同时说明结构体标签对字段名映射的关键作用。
在 Go 中,为结构体(尤其是包含切片字段的嵌套结构体)赋值,推荐使用结构体字面量(struct literal)语法,清晰、安全且无需预先声明变量。以 Species 为例,其 Human 和 Animal 字段均为 []Info 类型,需分别用切片字面量初始化,每个元素为 Info{} 形式。
关键点在于结构体标签(struct tags):json:"human" 和 json:"name" 等标签决定了序列化为 JSON 时的字段名称(小写 human 而非大写 Human),这是实现目标 JSON 格式的核心前提。若省略标签,Go 默认使用导出字段名(首字母大写),将导致输出为 "Human" 和 "Name",与预期不符。
以下是完整可运行示例:
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(string(b))
}注意事项:
- 结构体字段必须是导出字段(首字母大写),否则
json包无法访问,序列化结果为空; -
json.MarshalIndent第二个参数为前缀(空字符串表示无前缀),第三个参数为缩进符(此处用两个空格); - 若需反向操作(JSON → 结构体),可使用
json.Unmarshal; - 切片初始化支持简写:
{Name: "dave", Number: "00001"}是Info{Name: "dave", Number: "00001"}的等价写法,前提是字段顺序与定义一致且全部赋值。
掌握结构体字面量与 JSON 标签的配合,即可高效构建和序列化复杂数据结构。


















