前言
这是Go十大常见谬误系列的第一篇:未知枚举值。素材来源于Go布道者,现Docker公司资深工程师Teiva Harsanyi。
本文波及的源代码全副开源在:Go十大常见谬误源代码,欢送大家关注公众号,及时获取本系列最新更新。
场景
让咱们来看上面的代码示例:
type Status uint32const ( StatusOpen Status = iota StatusClosed StatusUnknown)
这里咱们应用iota
定义了一个枚举,对应的枚举值别离是:
StatusOpen = 0StatusClosed = 1StatusUnknown = 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 uint32const ( 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