前言

这是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