Go 中的 iota

iota 是 Go 语言中的常量计数器,只能在 const 声明块中使用。

每进入一个 const 块,iota 的值都会从 0 开始,每新增一行常量声明自动加 1


基本用法

const (
    A = iota
    B
    C
    D
)

结果:

A = 0
B = 1
C = 2
D = 3

等价于:

const (
    A = 0
    B = 1
    C = 2
    D = 3
)

每个 const 块独立计数

const (
    A = iota
    B
)

const (
    C = iota
    D
)

结果:

A = 0
B = 1

C = 0
D = 1

跳过某些值

使用空白标识符 _

const (
    A = iota
    _
    C
    D
)

结果:

A = 0
C = 2
D = 3

定义枚举

Go 没有真正的 enum,通常使用 iota 模拟枚举。

const (
    StatusPending = iota
    StatusRunning
    StatusSuccess
    StatusFailed
)

结果:

StatusPending = 0
StatusRunning = 1
StatusSuccess = 2
StatusFailed  = 3

从 1 开始

const (
    A = iota + 1
    B
    C
)

结果:

A = 1
B = 2
C = 3

位运算

经常用于权限定义。

const (
    Read = 1 << iota
    Write
    Execute
)

计算过程:

Read    = 1 << 0 = 1
Write   = 1 << 1 = 2
Execute = 1 << 2 = 4

结果:

Read    = 1
Write   = 2
Execute = 4

连续位标志

const (
    FlagA = 1 << iota // 1
    FlagB             // 2
    FlagC             // 4
    FlagD             // 8
)

结果:

FlagA = 1
FlagB = 2
FlagC = 4
FlagD = 8

组合使用:

permission := FlagA | FlagC

结果:

permission = 5

同一行多个常量

const (
    A, B = iota, iota
    C, D
)

结果:

A = 0
B = 0

C = 1
D = 1

iota 与表达式

const (
    KB = 1 << (10 * iota)
    MB
    GB
    TB
)

结果:

KB = 1024
MB = 1048576
GB = 1073741824
TB = 1099511627776

这是 Go 源码中常见的写法。


总结

iota 本质上是一个在 const 块内自动递增的整数计数器:

0 → 1 → 2 → 3 → ...

常见用途:

  1. 定义枚举值
  2. 跳号常量
  3. 位标志(权限控制)
  4. 数据单位(KB、MB、GB)
  5. 自动生成连续常量

最常见的两种写法:

// 枚举
const (
    Pending = iota
    Running
    Success
    Failed
)
// 权限位
const (
    Read = 1 << iota
    Write
    Execute
)

曼波