【Go】iota的使用简记

Go中的iota用于在const常量声明中定义递增的数字。

iota的发音是/īˈōdə/,是希腊字母表的第9个字母。 至于Go为什么选择这个,来源很少,据说Scheme里面也用这个。

iota的几个特性

  • 仅用于常量声明中
  • 一个从0开始的递增数值计数器,步长为1
  • 在每次const出现时重新计数,即重置为0
  • 可用于表达式中,作为子表达式使用

何时递增?

iota将在每个const定义行之后增加1。

  • 当然,空行、注释都不算一行
  • 多个用逗号分隔的常量只算一行
  • 表达式中没有iota的行也算一行

如下代码:

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,仍然会递增:

package main

import (
    "fmt"
)

const (
    X = 5
    Y = iota
    Z = iota
)

func main() {
    fmt.Println(X, Y, Z)
}

上述代码将输出:5 1 2

const 表达式的省略

const常量之后的表达式默认自动使用上一次的表达式。

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不只是可以单独使用,它还可以作为(子)表达式用于书写复杂的表达式。

如下代码:

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

一些用法示例

星期

const (
    Sunday    = iota // 0
    Monday           // 1
    Tuesday          // 2
    Wednesday        // 3
    Thursday         // 4
    Friday           // 5
    Saturday         // 6
)

存储大小

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
)

参考

发表于:2018年9月30日,阅读量:65,标签:Go

版权声明:若非特别注明,本站所有文章均为作者原创,转载请务必注明原文地址。