转载自:https://www.cnblogs.com/mingbai/p/goConstItoa.html
iota 是什么
const 内的 iota 是 golang 的常量计数器,只能在常量的表达式中使用,即 const 内。
iota 在 const 关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次。
可以参照行号理解,也就是说将 iota 理解为 const 语句块中的行索引。
iota 的特性
通过例子说明其各种特性。
1、每次 const 出现时,都会让 iota 初始化为 0。
1 2 3 4 5 |
const a = iota // a=0 const ( b = iota // b=0 c // c=1 ) |
2、自定义类型
自增长常量经常包含一个自定义枚举类型,允许你依靠编译器完成自增设置。
1 2 3 4 5 6 7 8 |
type Newtype int const ( T1 Newtype = iota // 0 T2 // 1 T3 // 2 T4 // 3 ) |
3、可跳过的值
1 2 3 4 5 6 7 8 9 10 |
type AudioOutput int const ( OutMute AudioOutput = iota // 0 OutMono // 1 OutStereo // 2 _ _ OutSurround // 5 ) |
4、位掩码表达式
1 2 3 4 5 6 7 8 9 |
type Allergen int const ( IgEggs Allergen = 1 << iota // 1 << 0 which is 00000001 IgChocolate // 1 << 1 which is 00000010 IgNuts // 1 << 2 which is 00000100 IgStrawberries // 1 << 3 which is 00001000 IgShellfish // 1 << 4 which is 00010000 ) |
5、定义数量级
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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) ) |
6、定义在一行的情况
跟普通形式 没什么不同
1 2 3 4 5 |
const ( Apple, Banana = iota + 1, iota + 2 Cherimoya, Durian Elderberry, Fig ) |
iota 在下一行增长,而不是立即取得它的引用。
1 2 3 4 5 6 |
// Apple: 1 // Banana: 2 // Cherimoya: 2 // Durian: 3 // Elderberry: 3 // Fig: 4 |
7、中间插队
中间插队时,iota 会被覆盖掉 ,不再继续自增。但是用另一个 iota 接一下,又会继续自增。 示例如下,中间插入了 5 和 6, 5 下面有 iota 接,6 没有。
1 2 3 4 5 6 7 8 |
const ( a = iota b = 5 c = iota d = 6 e f ) |
那么打印出来的结果是 0 5 2 6 6 6。
好处和坏处
使用 iota 能简化定义,在定义枚举时很有用。当代码需要改动的时候,也比较易于拓展或者修改。另外看起来也是有些逼格在里边的。
但是 itoa 令代码相对的不那么的明了易懂。会加大理解代码的负担。如果刚好遇上一个同事不太懂 itoa 的用法又不愿意学习,会加大挖坑的可能性。
所以建议适当的用,即只用其简单的特性就好了。 主张:代码的基本需求之一是 给人看的。机器跑起来没问题,让人能易于看懂才是好代码。