目录
常量与 Iota 详解
常量 (Constant) 是指在程序编译阶段就确定下来,且在运行期间无法改变的值。Go 语言的常量设计非常独特,支持无类型常量 (Untyped Constant) 和强大的枚举生成器 iota。
1. 常量基础
1.1 定义常量
使用 const 关键字定义。
go
const pi = 3.1415926
const e = 2.71821.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 1002. 无类型常量 (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 语言中的常量计数器,专门用于生成一组递增的常量(枚举)。
规则:
const关键字出现时,iota被重置为 0。const中每新增一行,iota计数加 1。
3.1 基础枚举
go
const (
a1 = iota // 0
a2 // 1
a3 // 2
)
fmt.Println(a1, a2, a3) // 0 1 23.2 使用下划线跳过
如果你想跳过某个值,可以使用 _。
go
const (
b1 = iota // 0
b2 // 1
_ // 2 (跳过)
b3 // 3
)
fmt.Println(b1, b2, b3) // 0 1 33.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 33.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扫描下方二维码,私信【训练营】可进行咨询和报名。 
