惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - Franky
V
V2EX
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 叶小钗
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
D
Docker
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志

Chongxiの咖啡屋

Google相册迁移到iCloud分享 - Chongxiの咖啡屋 讲讲「万物皆虚,万事皆允」 - Chongxiの咖啡屋 舞萌DX 落雪查分器使用指南 - Chongxiの咖啡屋 现代人的刻舟求剑 - Chongxiの咖啡屋 舞萌DX错误码0010深度解析及处理方法 - Chongxiの咖啡屋 做了一个明日方舟-奇象巡展的像素画拼豆工具 - Chongxiの咖啡屋 舞萌DX国服封禁机制详解 - Chongxiの咖啡屋 舞萌开机网络自检底层技术说明,断网如何排查讲解 - Chongxiの咖啡屋 舞萌机台开机初始化进程详解 - Chongxiの咖啡屋 为什么喜欢音乐 反而不该去学音乐? - Chongxiの咖啡屋 从装逼到嘉豪:中国互联网的精神胜利进化史 - Chongxiの咖啡屋 游蒋介石故居:奉化溪口 - Chongxiの咖啡屋 钢铁雄心4 steam正版导入全DLC补丁 - Chongxiの咖啡屋 漫漫长夜全地图及介绍 - Chongxiの咖啡屋 记一次无需实名换绑米哈游通行证手机号 - Chongxiの咖啡屋 邮储银行万事达借记卡全面指南 - Chongxiの咖啡屋 x402:一个来自27年前的状态码能救活被ai榨干的「人类网站」吗 - Chongxiの咖啡屋 舞萌国人口大普查:全服玩家数据分析 - Chongxiの咖啡屋 家中网络「捉奸」记 - Chongxiの咖啡屋 中国移动PT927G光猫折腾指南:破解超级密码改桥接 - Chongxiの咖啡屋 最好用的Android邮件客户端推荐 - Chongxiの咖啡屋 如何验证对方是不是Chongxi我本人 - Chongxiの咖啡屋 三星S20系列刷入移植OneUI8流程 - Chongxiの咖啡屋 使用obisidian和git插件来完美管理静态博客 - Chongxiの咖啡屋 玩客云拆机教程 - Chongxiの咖啡屋 母语级英语的本质,不是英语 - Chongxiの咖啡屋 我用过最好用的Android桌面(启动器) - Chongxiの咖啡屋 1. 区块链基本知识 - Chongxiの咖啡屋 b站创作激励提现几乎无门槛了 - Chongxiの咖啡屋 速报:APKPure 版 Telegram 被植入恶意后门 - Chongxiの咖啡屋
Ch.06:Go里的常量与iota - Chongxiの咖啡屋
Chongxi · 2026-05-04 · via Chongxiの咖啡屋

变量的值可以在运行时随时改变,但有些值从定义开始他就不应该变。例如圆周率、程序版本号、一周的天数。这类值用常量来表示,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 包怎么用,以及转换时的常见问题