Skip to content
目录

常量与 Iota 详解

常量 (Constant) 是指在程序编译阶段就确定下来,且在运行期间无法改变的值。Go 语言的常量设计非常独特,支持无类型常量 (Untyped Constant) 和强大的枚举生成器 iota

1. 常量基础

1.1 定义常量

使用 const 关键字定义。

go
const pi = 3.1415926
const e = 2.7182

1.2 批量声明

go
const (
    StatusOk = 200
    NotFound = 404
    ServerError = 500
)

1.3 自动填充规则

在批量声明中,如果省略后续行的赋值,默认使用上一行的表达式。

go
const (
    n1 = 100
    n2 // 100
    n3 // 100
)
fmt.Println(n1, n2, n3) // 输出: 100 100 100

2. 无类型常量 (Untyped Constants)

这是 Go 语言的一个重要特性。Go 的常量在没有显式指定类型时,被视为无类型的高精度数值。

go
const x = 10 // 无类型整数

func main() {
    var f float64 = x // ✅ 自动转换为 float64
    var i int = x     // ✅ 自动转换为 int
    
    // 如果 x 是 var x int = 10,上面第一行就会报错
}

无类型常量可以像字面量一样,自由地参与不同类型的运算,只要不溢出即可。

3. Iota 枚举器

iota 是 Go 语言中的常量计数器,专门用于生成一组递增的常量(枚举)。

规则

  1. const 关键字出现时,iota 被重置为 0。
  2. const 中每新增一行iota 计数加 1。

3.1 基础枚举

go
const (
    a1 = iota // 0
    a2        // 1
    a3        // 2
)
fmt.Println(a1, a2, a3) // 0 1 2

3.2 使用下划线跳过

如果你想跳过某个值,可以使用 _

go
const (
    b1 = iota // 0
    b2        // 1
    _         // 2 (跳过)
    b3        // 3
)
fmt.Println(b1, b2, b3) // 0 1 3

3.3 插队与恢复

这是一个经典的面试题场景。

go
const (
    c1 = iota // 0
    c2 = 100  // 100 (iota 继续在后台计数,此时为 1)
    c3 = iota // 2   (恢复 iota 计数)
    c4        // 3   (遵循自动填充规则,即 c4 = iota)
)
fmt.Println(c1, c2, c3, c4) // 0 100 2 3

3.4 一行多个常量

iota 是按递增的,不是按变量。如果一行有多个常量,它们共享同一个 iota 值。

go
const (
    d1, d2 = iota + 1, iota + 2 // iota = 0 -> d1=1, d2=2
    d3, d4 = iota + 1, iota + 2 // iota = 1 -> d3=2, d4=3
)

4. 实战:定义数量级

利用位运算 <<iota,可以优雅地定义计算机存储单位。

go
const (
    _  = iota
    KB = 1 << (10 * iota) // 1 << 10
    MB = 1 << (10 * iota) // 1 << 20
    GB = 1 << (10 * iota) // 1 << 30
    TB = 1 << (10 * iota) // 1 << 40
    PB = 1 << (10 * iota) // 1 << 50
)

func main() {
    fmt.Println("KB:", KB)
    fmt.Println("MB:", MB)
    fmt.Println("GB:", GB)
}

输出结果

text
KB: 1024
MB: 1048576
GB: 1073741824

扫描下方二维码,私信【训练营】可进行咨询和报名。 微信公众号二维码

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情