iota 用于创建递增常量非常有用,但也有不适合的应用场景。本文介绍几个适合使用itoa的示例,同时也提醒一些场景小心使用。
基本iota 用法
首先我们从它的基本用法开始:
const (
StarHyperGiant = iota
StarSuperGiant
StarBrightGiant
StarGiant
StarSubGiant
StarDwarf
StarSubDwarf
StarWhiteDwarf
StarRedDwarf
StarBrownDwarf
)
上面代码定义了一组常量类型,初始值使用 itoa 标识符赋值,告诉Go编译器第一个常量从0开始,后续常量依次加一.
当const在声明块前出现时,会重置计数器为0。下面代码一组枚举自会从零到四重新赋值:
const (
StarHyperGiant = iota
StarSuperGiant
StarBrightGiant
StarGiant
StarSubGiant
)
const (
StarDwarf = iota
StarSubDwarf
StarWhiteDwarf
StarRedDwarf
StarBrownDwarf
)
修改缺省枚举类型
枚举常量默认为无类型整数,我们也可以使用其他数值类型覆盖缺省类型,请看示例:
const (
StarDwarf byte = iota
StarSubDwarf
StarWhiteDwarf
StarRedDwarf
StarBrownDwarf
)
还可以指定任何数值类型,能表示整型或浮点类型。上面代码每个常量被声明为byte类型。
表达式中使用itoa
当itoa出现在表达式,实现机制和上面一致。编译器应用表达式对每个连续itoa增长值,下面代码给枚举成员赋偶数值:
const (
StarHyperGiant = 2. 0*iota
StarSuperGiant
StarBrightGiant
StarGiant
StarSubGiant
)
输出结果如下:
StarHyperGiant = 0 [float64]
StarSuperGiant = 2 [float64]
StarBrightGiant = 4 [float64]
StarGiant = 6 [float64]
StarSubGiant = 8 [float64]
跳过枚举值
对于枚举常量赋值,我们还可以跳过某些值。给空标识符则跳过值,下面示例跳过0和64:
_ = iota
StarHyperGiant = 1 << iota
StarSuperGiant
StarBrightGiant
StarGiant
StarSubGiant
_
StarDwarf
StarSubDwarf
StarWhiteDwarf
StarRedDwarf
StarBrownDwarf
因为我们跳过了0,首先第一个赋值常量从1开始。表达式 1<< iota 的结果为 1 << 1 = 2 ,第六个位置返回64,但该值被跳过,输出结果:
StarHyperGiant = 2
StarSuperGiant = 4
StarBrightGiant = 8
StarGiant = 16
StarSubGiant = 32
StarDwarf = 128
StarSubDwarf = 256
StarWhiteDwarf = 512
StarRedDwarf = 1024
StarBrownDwarf = 2048
我们再来一个示例:
const (
_ = 1 << (iota * 10)
KB
MB
GB
)
输出结果为:
KB = 1024
MB = 1048576
GB = 1073741824
更疯狂的用法
我们也可以使用itoa配对给同一行的常量赋值,同时也可以使用下划线跳过配对中的值:
const (
tomato, apple int = iota + 1, iota + 2
orange, chevy
ford, _
)
配对使用itoa对每一行进行计算:
tomato = 1, apple = 2
orange = 2, chevy = 3
ford = 3
和所有编程语言一样,可以这么做,但并意味着就应该这么做。建议生产环境不要写这种让人迷惑的代码。
总结
本文通过示例介绍Golang 的itoa表示符的几种应用场景。
|