**Go中的iota用于在const常量声明中定义递增的数字。** `iota`的发音是`/īˈōdə/`,是希腊字母表的第9个字母。 至于Go为什么选择这个,[来源很少](https://stackoverflow.com/a/31650491/3628322),据说Scheme里面也用这个。 ## iota的几个特性 - 仅用于常量声明中 - 一个从0开始的递增数值计数器,步长为1 - 在每次const出现时重新计数,即重置为0 - 可用于表达式中,作为子表达式使用 ## 何时递增? **iota将在每个const定义行之后增加1。** - 当然,空行、注释都不算一行 - 多个用逗号分隔的常量只算一行 - 表达式中没有iota的行也算一行 如下代码: ```go package main import ( "fmt" ) const ( A = iota // 这算一行 _ = iota // 这算一行 B = iota // 这个当然也算一行 // 这是一行注释,不算 // 上面的空行,不算 C, D = iota, iota // 一次性定义两个常量,只算一行,两个iota表达式的值一样 E = iota ) func main() { fmt.Println(A, B, C, D, E) } ``` 上述代码将输出:`0 2 3 3 4`。 不管const定义行中有没有iota,仍然会递增: ```go package main import ( "fmt" ) const ( X = 5 Y = iota Z = iota ) func main() { fmt.Println(X, Y, Z) } ``` 上述代码将输出:`5 1 2`。 ## const 表达式的省略 **const常量之后的表达式默认自动使用上一次的表达式。** ```go package main import ( "fmt" ) const ( A = iota B C D E ) func main() { fmt.Println(A, B, C, D, E) } ``` 上面代码中,后面的`B,C,D,E`的值都是表达式:`iota`。 代码将输出:`0 1 2 3 4`。 ## 复杂表达式 iota不只是可以单独使用,它还可以作为(子)表达式用于书写复杂的表达式。 如下代码: ```go package main import ( "fmt" ) const ( A = iota * 3 B C D E ) func main() { fmt.Println(A, B, C, D, E) } ``` 由于省略,`B,C,D,E`的表达式也都为`iota * 3`。 iota的值依次为:`0`,`1`,`2`,`3`,`4`。所以,`A,B,C,D,E`将依次为:`0`,`3`,`6`,`9`,`12`。 ## 一些用法示例 ### 星期 ```go const ( Sunday = iota // 0 Monday // 1 Tuesday // 2 Wednesday // 3 Thursday // 4 Friday // 5 Saturday // 6 ) ``` ### 存储大小 ```go type ByteSize float64 const ( _ = iota // ignore first value by assigning to blank identifier KB ByteSize = 1 << (10 * iota) MB GB TB PB EB ZB YB ) ``` ## 参考 - [Iota · golang/go Wiki](https://github.com/golang/go/wiki/Iota) - [★ Ultimate Visual Guide to Go Enums ★ – Learn Go Programming](https://blog.learngoprogramming.com/golang-const-type-enums-iota-bc4befd096d3)