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

为什么我们需要在Go中使用Iota

时间:2023-03-17 16:56:55 科技观察

转载本文请联系吴勤强深夜食堂公众号。简介Go语言实际上并没有直接支持枚举的关键字。一般我们通过const+iota来实现枚举能力。有人要问了,为什么一定要用枚举呢?stackoverflow[1]上有一个被高度评价的答案,如下:当一个变量(尤其是方法参数)只能从一小组可能的值中取一个时,你应该总是使用枚举。例如类型常量(合同状态:“永久”、“临时”、“学徒”)或标志(“立即执行”、“延迟执行”)。如果您使用枚举而不是整数(或字符串代码),您会增加编译时检查并避免因传递无效常量而导致的错误,并且您会记录哪些值可以合法使用。简单的翻译一下,有两点很重要。当变量(尤其是方法参数)只能取一小组可能值中的一个时,应使用枚举。例如,类型常量(合同状态:永久、临时、学徒),或者在做任务程序时立即执行或延迟执行的标志。如果使用枚举而不是整数,则会添加编译时检查以避免传入不正确的无效值并记录哪些值是合法使用的。如何实现enumiota是Go中预先声明的一个特殊常量。它会被预先声明为0,但它的值在编译阶段并不固定。当预先声明的iota出现在常量声明中时,它在第n个常量描述中的值为n(从0开始)。比如大家对电子商务系统都或多或少有所了解。订单模块肯定会涉及到订单状态的流转。这个时候,我们一般可以这样定义:packagemainimport"fmt"typeOrderStatusintconst(CancelledOrderStatus=iota//订单已取消0NoPayOrderStatus=iota//未支付1PendIngOrderStatus=iota//未交付2DeliveredOrderStatus=iota//已交付3ReceivedOrderStatus=iota//Receivedgoods4)funcmain(){fmt.Println(Cancelled,NoPay)//打印:0,1}当然这样看起来很麻烦。其实其他常量可以重复iota表达式的前一行,我们可以改成这样。packagemainimport"fmt"typeOrderStatusintconst(CancelledOrderStatus=iota//订单已取消0NoPay//未付款1PendIng//未交付2Delivered//已交付3Received//已接收4)funcmain(){fmt.Println(Cancelled,NoPay)//打印:0,1}会有人用0来表示状态吗?一般不会,我们想从1开始,这样就可以了。packagemainimport"fmt"typeOrderStatusintconst(CancelledOrderStatus=iota+1//订单已取消1NoPay//未支付2PendIng//未交付3Delivered//已交付4Received//已接收5)funcmain(){fmt.Println(Cancelled,NoPay)//Print:1,2}我们还想跳过Delivered后面的一个数字,也就是Received的值,即Received=6,所以可以用_符号。packagemainimport"fmt"typeOrderStatusintconst(CancelledOrderStatus=iota+1//订单已取消1NoPay//未支付2PendIng//未交付3Delivered//已交付4_Received//已接收6)funcmain(){fmt.Println(已接收)//打印:6}顺着走没问题,当然要倒着走。packagemainimport"fmt"typeOrderStatusintconst(Max=5)const(ReceivedOrderStatus=Max-iota//ReceivedOrderStatus=Max-iota//Received5Delivered//Delivered4PendIng//Notdelivered3NoPay//Notpaid2Cancelled//订单已取消1)funcmain(){fmt.Println(Received,Delivered)//Print:5,4}也可以使用位操作,比如在go源码中的包sync中lock上面有这么一段定义代码。const(mutexLocked=1<

最新推荐
猜你喜欢