在使用 Go (Golang) 并将数据编码为 JSON 时,您可能会遇到这样的情况:如果某些字段的值为空,则需要从编码输出中省略这些字段。这就是 Golang 的 omitempty
功能发挥作用的地方。struct 字段标记中的 omitempty
选项会告诉编码器,如果字段为空值,则跳过该字段。
什么是 “Empty Value”?
在 Go 中,Empty Value
的定义是:
布尔类型为 false 0 表示数字类型 指针、接口、Map、切片和 Channel 为 nil 字符串类型的空字符串
使用案例
让我们考虑一下网络应用中的一种常见情况:您需要发送 JSON 格式的编码数据。Go 的 JSON 处理方式可能与通常的 JSON 表示方式略有不同。
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}
需要初始化一个学生对象并将其编码为 JSON:
student := Student{
Name: "Denny",
Age: 17,
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
输出结果是:
{"name":"Denny","age":17}
这可以达到预期效果。但如果学生的年龄未知呢?
student := Student{
Name: "Denny",
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
在这种情况下输出结果将是:
{"name":"Denny","age":0}
使用 “omitempty” 处理未知的值
在上面的示例中,年龄字段被设置为默认值 0,这看起来并不合理,因为它可能会产生误导。要避免这种情况,可以使用 omitempty
标签:
type Student struct {
Name string `json:"name"`
Age int `json:"age,omitempty"`
}
现在,如果没有提供年龄或年龄设置为 0,JSON 输出中将忽略年龄字段:
student := Student{
Name: "Denny",
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
输出结果是:
{"name":"Denny"}
使用 Omitempty 标记后,如果年龄字段设置为零值(整数为 0),则不会包含在 JSON 输出中。
总结
Golang 中的 omitempty 标签是 JSON 编码的一个强大功能。它能确保编码输出中不包含空值字段,从而防止误导性数据表示并减小 JSON 有效载荷的大小。在需要发送准确的 JSON 响应的网络应用程序和应用程序接口中,该功能尤其有用。