共计 1074 个字符,预计需要花费 3 分钟才能阅读完成。
前言
这是 Go 十大常见谬误系列的第一篇:未知枚举值。素材来源于 Go 布道者,现 Docker 公司资深工程师Teiva Harsanyi。
本文波及的源代码全副开源在:Go 十大常见谬误源代码,欢送大家关注公众号,及时获取本系列最新更新。
场景
让咱们来看上面的代码示例:
type Status uint32
const (
StatusOpen Status = iota
StatusClosed
StatusUnknown
)
这里咱们应用 iota
定义了一个枚举,对应的枚举值别离是:
StatusOpen = 0
StatusClosed = 1
StatusUnknown = 2
假如咱们业务代码里的数据结构蕴含了枚举类型,比方下例:
type Request struct {
ID int `json:"Id"`
Timestamp int `json:"Timestamp"`
Status Status `json:"Status"`
}
咱们要把承受到的 JSON 申请反序列化为 Request
构造体类型。
{
"Id": 1234,
"Timestamp": 1563362390,
"Status": 0
}
对于下面这个 JSON 申请数据,Request
构造体里的 Status
字段会被解析为 0,对应的是StatusOpen
,合乎预期。
然而如果因为各种起因没有传 Status
字段,对于如下的 JSON 申请
{
"Id": 1235,
"Timestamp": 1563362390
}
在将这个 JSON 申请反序列化为 Request
构造体类型的时候,因为 JSON 串里没有 Status
字段,因而 Request
构造体里的 Status
字段的值会是零值,也就是 uint32
的零值 0。这个时候 Status
字段的值还是StatusOpen
,而不是咱们预期的StatusUnknown
。
最佳实际
因而对于枚举值的最佳实际,是把枚举的未知值设置为 0。
type Status uint32
const (
StatusUnknown Status = iota
StatusOpen
StatusClosed
)
这样设计后,如果 JSON 申请里没有传 Status
字段,那反序列化后的 Request
构造体里的 Status
字段的值就是StatusUnknown
,合乎预期。
开源地址
文章和示例代码开源在 GitHub: Go 语言高级、中级和高级教程。
公众号:coding 进阶。关注公众号能够获取最新 Go 面试题和技术栈。
集体网站:Jincheng’s Blog。
知乎:无忌。
References
- https://itnext.io/the-top-10-…
- https://gobyexample.com/json
正文完