TL;DR:本文介绍了在Golang中常量和iota用法
变量的值可以在运行时随时改变,但有些值从定义开始他就不应该变。例如圆周率、程序版本号、一周的天数。这类值用常量来表示,Go 用 const 声明
常量的基本声明
const Pi = 3.14159const AppName = "MyApp"const MaxRetry = 3常量声明之后不能修改,强行赋值会报错:
const Pi = 3.14159Pi = 3.14 // 报错:cannot assign to Pi常量也可以指定类型:
const Pi float64 = 3.14159const MaxRetry int = 3不指定类型的常量叫无类型常量,灵活性更高,后面会讲
多个常量可以用括号一起声明:
const ( AppName = "MyApp" Version = "1.0.0" MaxRetry = 3)常量和变量的区别
常量只能是编译阶段就能确定的值,不能是运行时才能得到的结果:
const now = time.Now() // 报错,time.Now() 是运行时才能得到的值能用作常量的值:字符串字面量、数字字面量、布尔值、以及由这些构成的表达式:
const ( A = 1 B = 2 C = A + B // ✅ 编译阶段就能算出来)常量没有声明了必须使用的限制,这点和变量不同:
const unused = 42// 不使用也不报错无类型常量
不指定类型的常量叫无类型常量,它在被使用时才确定类型:
const x = 42
var a int = x // x 当作 int 用var b float64 = x // x 当作 float64 用var c int32 = x // x 当作 int32 用如果 x 是有类型的常量,这样赋值就要显式转换:
const x int = 42var b float64 = float64(x) // 必须转换无类型常量的好处是灵活,不需要反复转换类型,标准库里大量使用这个特性
无类型常量有自己的默认类型,在必须确定类型的场合使用默认类型:
const x = 42 // 默认类型 intconst f = 3.14 // 默认类型 float64const s = "hello" // 默认类型 stringconst b = true // 默认类型 booliota
iota 是常量声明里的一个特殊计数器,只能在 const 块里用
每个 const 块开始时,iota 从 0 开始,每声明一个常量自动加 1:
const ( A = iota // 0 B = iota // 1 C = iota // 2)通常简写,后面的常量重复使用同一个表达式:
const ( A = iota // 0 B // 1,自动复用上一行的表达式 C // 2)每次新建一个 const 块,iota 重置为 0:
const ( A = iota // 0 B // 1)
const ( C = iota // 0,新的 const 块,iota 重置 D // 1)iota 的实际用法
用来定义枚举
Go 没有专门的枚举类型,用 iota 模拟:
type Weekday int
const ( Sunday Weekday = iota // 0 Monday // 1 Tuesday // 2 Wednesday // 3 Thursday // 4 Friday // 5 Saturday // 6)type Weekday int 定义了一个新类型,底层是 int,但类型不同,不能混用,更安全
用 _ 跳过不需要的值:
const ( _ = iota // 0,跳过 KB = 1 << (10 * iota) // 1 << 10 = 1024 MB // 1 << 20 = 1048576 GB // 1 << 30 = 1073741824 TB // 1 << 40)这里用位移运算来定义文件大小单位,1 << 10 是 1024,1 << 20 是 1024²,以此类推
从非零值开始
const ( A = iota + 1 // 1 B // 2 C // 3)iota 用在表达式里
iota 可以参与任何表达式:
const ( A = iota * 2 // 0 B // 2 C // 4 D // 6)iota 的坑
中间插入非 iota 常量,计数不停
const ( A = iota // 0 B = 100 // 100,但 iota 此时是 1 C = iota // 2,iota 继续计数)iota 不管你中间有没有用它,这必扬的都在自己计数
iota 只能在 const 块里用
var x = iota // 报错,iota 只能在 const 里用同一行的多个常量共用同一个 iota 值
const ( A, B = iota, iota + 1 // A=0, B=1,同一行 iota 都是 0 C, D // C=1, D=2)同一行声明多个常量,iota 值相同,不会在同一行内递增
常量在实际项目里用法示例
HTTP 状态码:
const ( StatusOK = 200 StatusNotFound = 404 StatusError = 500)用户角色:
type Role int
const ( RoleGuest Role = iota RoleUser RoleAdmin)错误码:
type ErrCode int
const ( ErrOK ErrCode = 0 ErrUnknown ErrCode = iota + 1000 // 从 1001 开始 ErrTimeout ErrNotFound)下一篇讲类型转换,Go 不做隐式转换,所有转换必须明确写出来,strconv 包怎么用,以及转换时的常见问题
Auth_Verified: 2026.05.03