go语言枚举类型是这样使用的?在什么场景下使用枚举?本文详细讲解了go语言中的枚举。枚举是一种重要的数据类型,由一组键值对组成,在编程语言中通常用作常量的标识符。c、java等各大流行编程语言都有原生支持,在go中,你找不到enum或者其他直接用来声明枚举类型的关键字。从熟悉其他编程语言的开发人员转为Go编程,一开始可能很难接受。其实如果你看到go是如何表示枚举类型的,你可能会觉得go语言的设计者考虑到了问题的简单性和深度,这是一般的初级工程师无法比拟的。其实在go语言的设计者眼里,enum本质上就是一个常量,为什么要多出一个关键字呢?在go中,只有没有enum关键字,其枚举形式与其他语言没有太大区别。让我们看看如何在go中表示枚举。学习和使用一门语言就是学习和理解语言本身的设计哲学,同时感受设计者的个性。基础工作是为了后面的说明方便。这里我们先使用gomodules创建一个简单的项目。~/Projects/go/examples?mkdirenum~/Projects/go/examples?cdenum~/Projects/go/examples/enum?gomodinititenumgo:creatingnewgo.mod:moduleenum~/Projects/go/examples/enum?touchenum.goconst+iota以启动、运行、停止三种状态为例,使用const键声明一系列常量值。在enum.go中写入以下内容::",Stopped)}保存运行,可以得到如下结果,~/Projects/go/examples/enum?gorunenum.goStaterunning:0Statepending:1StateStoped:2在解释发生了什么之前,我们先看一个东西,iota。相比于c和java,go提供了一个常量计数器iota,在声明常量的时候使用连续赋值的方式。例如,在这个例子中,const(aint=iota//a=0bint=iota//b=1cint=iota//c=2)constdint=iota//d=0在const声明块中,初始值iota为0,每声明一个变量,就加1。上面的代码可以简化为:const(aint=iota//a=0b//b=1c//c=2)constdint=iota//d=0想象一下,如果此时有50个或100个常量,用c和java语言写的话会怎样。关于iota,还有更具体的技术(比如hopcount),具体可以参考iota官方定义。使用const定义一系列常量,使用iota常量计数器可以快速连续地给数值类型的常量赋值,非常方便。尽管在本例中没有使用enum关键字是多余的,但枚举本质上是常量的组合。当然你可以用下面的方法更接近其他语言的enum,//enum.go...typeStateintconst(RunningState=iotaPendingStopped)...用类型别名包裹一组常量值,是不是'它更像是其他语言中的enum{}定义呢?你也可以把上面的例子改成://enum.go...typeStateintconst(RunningState=iotaPendingStopped)func(sState)String()string{switchs{caseRunning:return"Running"casePending:return"Pending"caseStopped:return"Stopped"default:return"Unknown"}}...将String函数添加到定义的枚举类型中,运行结果如下:~/Projects/go/examples/enum?gorunenum.goStaterunning:RunningStatepending:PendingStateStoped:StoppedIs它是很神奇的,一段时间下来思路开阔了,增长了很多知识。将实际值与打印字符分开是语言设计者通常不会考虑的事情。看到这里,你有没有这种感觉呢?Go语言的设计者不是偷懒,而是为了偷懒想了很多,做了很多。
