go 中 iota 枚举的使用

iota 的基本规则

  • iotago 语言的常量计数器,只能配合常量表达式使用。
  • 在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为0,然后在每一个有常量声明的行加1,可以将 iota 看作是 const 块的索引
  • 不同的 const 块不会互相干扰。
  • 没有表达式的常量定义复用上一行的表达式。
  • _ 设置可跳过的值
  • 下一行的表达式可省略

示例

1. iotaconst 块中不会互相干扰
const a = iota // a=0 
const ( 
  b = iota     //b=0 
  c            //c=1   相当于c=iota
)
2. 没有表达式的常量定义复用上一行
const (
	 a = iota * 2 // 0
	 b			  // 2
	 c			  // 4
)
3. _ 设置可跳过的值
const (
	 a = iota * 2 // 0
	 b			  // 2
	 _
	 c			  // 6
)
4. 下一行的表达式省略
const (
	a = "a"  // a
	b		 // a
	c = iota // 2
	d		 // 3
	e = 1	 // 1
	f		 // 1
)

常见用法

标准库 time 包中的 iota 示例
type Weekday int

const (
	Sunday Weekday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)
定义数量级
type ByteSize float64

const (
    _           = iota                   // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota) 	     // 1 << (10*1)
    MB                                   // 1 << (10*2)
    GB                                   // 1 << (10*3)
    TB                                   // 1 << (10*4)
    PB                                   // 1 << (10*5)
    EB                                   // 1 << (10*6)
    ZB                                   // 1 << (10*7)
    YB                                   // 1 << (10*8)
)
自定义类型并做 string 输出
type EviType int

const (
	WifiRouter EviType = iota
	GoIP
	Uav
	SmartTV
	SmartWare
	SmartCamera
	NAS
)

func (i EviType) String() string {
	if i >= WifiRouter && i <= NAS {
		return [...]string{"路由器", "GoIP等", "无人机", "智能电视", "智能穿戴", "智能摄像头", "NAS设备"}[i]
	}
	return "not in iota: " + string(i)
}

func main() {
	fmt.Println(WifiRouter) // 路由器
	fmt.Println(NAS) // NAS设备
}

总结

iota 的玩法有很多,但是一般情况下,常见用法里类似的就够用了,太复杂也难理解。当然不用也行,但是优雅永不过时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值