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

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
罗磊的独立博客
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
J
Java Code Geeks
V2EX - 技术
V2EX - 技术
Vercel News
Vercel News
N
News and Events Feed by Topic
腾讯CDC
P
Proofpoint News Feed
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
爱范儿
爱范儿
O
OpenAI News
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
D
Docker
Y
Y Combinator Blog
博客园 - 聂微东
G
Google Developers Blog
S
Security @ Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
CERT Recently Published Vulnerability Notes
I
Intezer
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
W
WeLiveSecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
Scott Helme
Scott Helme
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
LINUX DO - 最新话题
C
Cybersecurity and Infrastructure Security Agency CISA

博客园 - 刘俊涛的博客

qoder-体验分享 50+专家角色+多代理框架,一个人就能建起一支AI 公司 小米突然放大招!2亿 Token 免费领,最后几天冲刺! 这个项目把浏览器“干了30年的事”干掉了:Pretext 为什么突然爆火? 通用商品打标模块实现方案(基于位运算,适配多框架多语言) 后端工程中使用 Model + Trait 设计可复用的数据模型(完整实现示例) 最小阻力之路 U盘打不开 : 文件损坏 : 提示需要格式化?用CHKDSK轻松修复教程 祂看顧麻雀(His Eye Is on the Sparrow)鄭漢良 别再把一切都变成数组了:用迭代器让 JavaScript 既快又省心 Spark性能调优实战笔记 Spark神操作:轻松拿捏公司“历史烂数据”,一人干翻十年脏表 特定血型血液生成的研究进展:化学合成与微生物生产技术路线 禁止直接 update 业务关键字段 非暴力沟通 PHP 8.1+ 引入的 枚举(Enum) 类型 PHP 8.5 新特性速览:管道操作符、clone with、闭包增强与更多实用功能 从错误中学习 产品拆解到底怎么做?8步框架,新手产品经理必学干货! 《创作与爱:托芙·扬松传》读书笔记 MongoDB 端口安全加固方案 为什么软件反应特别慢?一次因版本架构错误导致的性能问题排查记录
【Go 语言神器】iota 到底是什么?为什么高手都爱用它?
刘俊涛的博客 · 2025-10-10 · via 博客园 - 刘俊涛的博客

【Go 语言神器】iota 到底是什么?为什么高手都爱用它?

你是不是在看 Go 源码时,经常看到一个奇怪的词 —— iota
它看起来像个变量,却又不能赋值;像个常量,却会自动变。

今天,我就来给你彻底讲透 iota 的本质、用法,以及为什么它是 Go 语言中最被低估的“神器”之一。

1. 它到底是什么?

一句话解释:

iota 是 Go 语言里的常量计数器,在同一个 const 声明块中从 0 开始自动递增。

简单说,就是编译器帮你自动生成连续的常量值,你不用自己一个个写数字。

2. 最常见的用法:枚举

不用 iota,你可能会这样写:

const (
    Sunday = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
)

这样写的问题:

  • 插入或删除一行,后面的数字全要改
  • 容易写错,可读性差

iota,直接这样:

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

✅ 好处:

  • 顺序调整不影响编号
  • 代码简洁,易维护
  • 出错率几乎为零

3. 进阶用法:位掩码(Bitmask)

位掩码常用于权限控制、选项组合等场景。
不用 iota

const (
    Read  = 1  // 001
    Write = 2  // 010
    Exec  = 4  // 100
)

iota

const (
    Read  = 1 << iota // 1 << 0 = 1
    Write             // 1 << 1 = 2
    Exec              // 1 << 2 = 4
)

✅ 好处:

  • 不用手动算 1、2、4、8、16…
  • 顺序调整不会影响值的正确性

4. 黑科技:常量表达式 + iota

iota 可以参与任意常量表达式,比如定义存储单位:

const (
    _  = iota             // 0,丢弃
    KB = 1 << (10 * iota) // 1 << 10 = 1024
    MB                    // 1 << 20 = 1048576
    GB                    // 1 << 30
)

以后要加 TBPB,直接加一行就行,自动计算。

5. 重置与中断

iota 在每个 const 块都会从 0 重新计数

const (
    A = iota // 0
    B        // 1
)

const (
    X = iota // 0(重置)
    Y        // 1
)

如果中途手动赋值,iota 会继续按行号计数:

const (
    P = iota // 0
    Q        // 1
    R = 100  // 手动赋值
    S = iota // 3
)

6. 为什么高手都爱用 iota?

  • 代码简洁:不用写一堆数字
  • 可读性高:意图一目了然
  • 易于维护:插入/删除常量不影响编号
  • 不易出错:编译器自动生成,避免手误

7. 总结

iota 就是 Go 官方提供的自动递增常量生成器,最适合用来写枚举、位掩码和有规律的常量集合。

掌握 iota,你的 Go 代码会更短、更安全、更专业。

最后的小建议
以后写 Go 代码,只要看到连续数字常量,先想想能不能用 iota 替代,这是高手和新手的一个明显区别。

Don’t reinvent the wheel, library code is there to help.

欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。