当前位置: 首页 > 科技观察

三分钟带你用Go语言实现枚举

时间:2023-03-16 14:27:28 科技观察

本文转载请联系GoLang全栈公众号。Go语言没有枚举关键字enum。那么Go语言是如何处理枚举问题的呢?让我们在这篇文章中解释它!在处理枚举场景的时候,我们在处理人名的时候,一般都是男的或者女的,或者最多一个不详,不会有其他的类型。常见如上,我们一般使用枚举处理。我们会定义一个变量,希望它只能赋三个值:male、female、unknown。如果是其他语言:fromenumimportEnumclassSex(Enum):man=1woman=2unknown=3那么使用的时候直接调用Sex.main即可。Go的实现在Go语言中,如果我们要实现枚举,需要使用常量计数器iota结合const来实现。iota是go语言中的常量计数器,只能用在const中。例如:const(SexMan=iotaSexWomanSexUnknown)funcmain(){fmt.Println(SexMan,SexWoman,SexUnknown)}//执行结果$gorunmain.go012首先我们知道const是用来定义常量的,后面的括号定义了一组常量。我们将iota赋值给第一个常量,在这组常量中,后面的常量会自动为我们赋值和递增。iota有什么特点?当const关键字出现在iota中时,在const里面的第一行之前被初始化为0。const中每增加一行常量声明都会自动加1,即使是_的声明。const(SexMan=iotaSexWoman_SexUnknown)funcmain(){fmt.Println(SexMan,SexWoman,SexUnknown)}//执行结果$gorunmain.go013你会发现最后一个变量的值变了。在其他情况下会出现这种情况const(SexMan=iotaSexWoman="woman"SexUnknown)funcmain(){fmt.Println(SexMan,SexWoman,SexUnknown)}//执行结果$gorunmain.go0womanwoman出现在常量中iota的定义,如果专门给一个值赋值,那么后面的值都会相同。解决方案是在需要恢复计数的地方再次分配iota:const(SexMan=iotaSexWoman="woman"SexUnknown=iotaSexUnknown1)funcmain(){fmt.Println(SexMan,SexWoman,SexUnknown,SexUnknown1)}//执行结果$gorunmain.go0woman23skillsupgrade我们在定义一个枚举的时候,往往会显式声明它的类型,例如:typeSexintconst(SexManSex=iotaSexWomanSexUnknown)为什么要这样做呢?这样做的一个好处是,我们可以扩展我们的性别类型。例如:typeSexintfunc(thisSex)String()string{switchthis{case0:return"male"case1:return"female"default:return"unknown"}}const(SexManSex=iotaSexWomanSexUnknown)funcmain(){fmt.Println(SexMan,SexWoman,SexUnknown)}//执行结果$gorunmain.gomaleandfemaleunknownfmt在打印ln的时候会调用这个变量的String方法,所以male,female,unknown会出现在打印出来。当然你也可以根据自己的需要进行扩展。你失学了吗?