复制成功
请遵守本站 许可
REPORT
Chapter_Post // Field_Report

Post_Ref: RL-CH06-COS

2026.05.03

Ch.06:Go里的常量与iota

Chongxi
Chongxi
Listening: IDLE_SESSION
#教程#Golang
ANALYSIS

TL;DR:本文介绍了在Golang中常量和iota用法

变量的值可以在运行时随时改变,但有些值从定义开始他就不应该变。例如圆周率、程序版本号、一周的天数。这类值用常量来表示,Go 用 const 声明

常量的基本声明#

PRTCL // GO
const Pi = 3.14159
const AppName = "MyApp"
const MaxRetry = 3

常量声明之后不能修改,强行赋值会报错:

PRTCL // GO
const Pi = 3.14159
Pi = 3.14 // 报错:cannot assign to Pi

常量也可以指定类型:

PRTCL // GO
const Pi float64 = 3.14159
const MaxRetry int = 3

不指定类型的常量叫无类型常量,灵活性更高,后面会讲

多个常量可以用括号一起声明:

PRTCL // GO
const (
AppName = "MyApp"
Version = "1.0.0"
MaxRetry = 3
)

常量和变量的区别#

常量只能是编译阶段就能确定的值,不能是运行时才能得到的结果:

PRTCL // GO
const now = time.Now() // 报错,time.Now() 是运行时才能得到的值

能用作常量的值:字符串字面量、数字字面量、布尔值、以及由这些构成的表达式:

PRTCL // GO
const (
A = 1
B = 2
C = A + B // ✅ 编译阶段就能算出来
)

常量没有声明了必须使用的限制,这点和变量不同:

PRTCL // GO
const unused = 42
// 不使用也不报错

无类型常量#

不指定类型的常量叫无类型常量,它在被使用时才确定类型:

PRTCL // GO
const x = 42
var a int = x // x 当作 int 用
var b float64 = x // x 当作 float64 用
var c int32 = x // x 当作 int32 用

如果 x 是有类型的常量,这样赋值就要显式转换:

PRTCL // GO
const x int = 42
var b float64 = float64(x) // 必须转换

无类型常量的好处是灵活,不需要反复转换类型,标准库里大量使用这个特性

无类型常量有自己的默认类型,在必须确定类型的场合使用默认类型:

PRTCL // GO
const x = 42 // 默认类型 int
const f = 3.14 // 默认类型 float64
const s = "hello" // 默认类型 string
const b = true // 默认类型 bool

iota#

iota 是常量声明里的一个特殊计数器,只能在 const 块里用

每个 const 块开始时,iota 从 0 开始,每声明一个常量自动加 1:

PRTCL // GO
const (
A = iota // 0
B = iota // 1
C = iota // 2
)

通常简写,后面的常量重复使用同一个表达式:

PRTCL // GO
const (
A = iota // 0
B // 1,自动复用上一行的表达式
C // 2
)

每次新建一个 const 块,iota 重置为 0:

PRTCL // GO
const (
A = iota // 0
B // 1
)
const (
C = iota // 0,新的 const 块,iota 重置
D // 1
)

iota 的实际用法#

用来定义枚举

Go 没有专门的枚举类型,用 iota 模拟:

PRTCL // GO
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)

type Weekday int 定义了一个新类型,底层是 int,但类型不同,不能混用,更安全

_ 跳过不需要的值:

PRTCL // GO
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²,以此类推

从非零值开始

PRTCL // GO
const (
A = iota + 1 // 1
B // 2
C // 3
)

iota 用在表达式里

iota 可以参与任何表达式:

PRTCL // GO
const (
A = iota * 2 // 0
B // 2
C // 4
D // 6
)

iota 的坑#

中间插入非 iota 常量,计数不停

PRTCL // GO
const (
A = iota // 0
B = 100 // 100,但 iota 此时是 1
C = iota // 2,iota 继续计数
)

iota 不管你中间有没有用它,这必扬的都在自己计数

iota 只能在 const 块里用

PRTCL // GO
var x = iota // 报错,iota 只能在 const 里用

同一行的多个常量共用同一个 iota 值

PRTCL // GO
const (
A, B = iota, iota + 1 // A=0, B=1,同一行 iota 都是 0
C, D // C=1, D=2
)

同一行声明多个常量,iota 值相同,不会在同一行内递增

常量在实际项目里用法示例#

HTTP 状态码:

PRTCL // GO
const (
StatusOK = 200
StatusNotFound = 404
StatusError = 500
)

用户角色:

PRTCL // GO
type Role int
const (
RoleGuest Role = iota
RoleUser
RoleAdmin
)

错误码:

PRTCL // GO
type ErrCode int
const (
ErrOK ErrCode = 0
ErrUnknown ErrCode = iota + 1000 // 从 1001 开始
ErrTimeout
ErrNotFound
)

下一篇讲类型转换,Go 不做隐式转换,所有转换必须明确写出来,strconv 包怎么用,以及转换时的常见问题

R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.05.03
// END OF POST
Donation_Channel // Support_Us

如果觉得本文不错,不妨请我喝杯咖啡。

爱发电
golearn
Series_Associated // 专题收录

从0带你学Golang

该文章已被收录至本站深度研究专题。点击进入项目主页,查看完整研究序列。

Classified
Chapter_06 // Legal_Protocol
Protocol_Ref: CC-BY-NC-SA-4.0

Ch.06:Go里的常量与iota

Author: CHONGXI // Released: 2026.05.03

本受试报告采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议进行分发。

} } out>