理解并使用 Golang 的 “omitempty” 特性

文摘   2024-07-14 21:29   中国香港  

在使用 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 响应的网络应用程序和应用程序接口中,该功能尤其有用。


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章