← Backend / Go / 基础专题

05_常量与iota

声明常量,理解无类型常量与 `iota` 的用途及风险。

Go 基础专题 05:常量与 iota

学习目标:声明常量,理解无类型常量与 iota 的用途及风险。

核心知识

const 定义编译期常量,适用于状态标签、数学值和固定配置;运行时从环境变量取得的值不能声明为常量。未指定类型的数值常量在使用时可适配目标类型,但必须可表示。相比变量,常量不能取地址,也不能在运行时修改。

package main

import "fmt"

const maxRetries = 3

const (
    pending = iota
    running
    done
)

func main() {
    fmt.Println(maxRetries, pending, running, done)
}

iota 在每个 const 声明组内从 0 开始逐行递增。它适合包内枚举或位标记,但如果数值写进数据库或网络协议,后来插入新常量会改变旧编号;这类契约应显式赋稳定值。多个常量可以共享前一行表达式,但过度省略会降低可读性。

Go 的字符串常量是不可变值;布尔常量为 true、false。常量运算可在编译阶段完成,超出目标变量范围时编译器会拒绝赋值。

逐步理解

手推 iota:第一行 pending 是 0,下一行 running 是 1,第三行 done 是 2。若在开头插入一行,后面数值会整体变化,所以对外状态码要显式赋值。常量适合不会变化的值,配置文件读取、当前时间等运行时信息要用变量。

动手练习

练习:定义三个稳定的状态字符串。答案示例:const StatusDraft = "draft" 等,外部可见名称首字母大写。