Go 语言 const & iota

part 1.

要明白 iota 首先需要知道:Go 的 const 语法提供了"隐式重复前一个非空表达式"的机制

c 复制代码
const (
 A = 1       // 1
 B           // 1
 C           // 1
)

常量定义的后两行没有显式给予初始赋值,Go 编译器将为其隐式使用第一行的表达式。

part 2.

iota 是 Go 语言的一个预定义标识符,它表示的含义是 const 声明块中每个常量所处位置在块中的偏移值,从0开始(也可理解为 const 语句块中的行索引)。

ini 复制代码
// 一般写法
const (
 Sunday    = 0
 Monday    = 1
 Tuesday   = 2
 Wednesday = 3
 Thursday  = 4
 Friday    = 5
 Saturday  = 6
)

// iota 写法
const (
 Sunday = iota
 Monday
 Tuesday
 Wednesday
 Thursday
 Friday
 Saturday
)

来看下面这个例子:

go 复制代码
const (
 A = iota - 1 // -1  由于这里是 const 声明块的第一行,iota 的值是该行在 const 块中的偏移,因此 iota 的值为 0
 B            //  0
 C            //  1
 D = iota     //  3  由于该行为第四行,iota 的偏移值为 3
 E            //  4
)

略过 iota = 0,从 iota = 1 开始正式定义枚举常量:

go 复制代码
const (
 _ = iota
 A            // 1
 B            // 2
 C            // 3
)

位于同一行的 iota 即便出现多次,其值也是一样的:

go 复制代码
const (
 _      = iota
 A, PI1 = iota, 3.14 / (2 * iota) // 1, 3.14 / (2 * 1)
 B, PI2                           // 2, 3.14 / (2 * 2)
 C, PI3                           // 3, 3.14 / (2 * 3)
)

略过某一行:

go 复制代码
const (
 _ = iota
 A            // 1
 B            // 2
 C            // 3
 _
 E            // 5
)

使用有类型枚举常量保证类型安全:

如果要严格考虑类型安全,可以定义有类型枚举常量,比如上述代码的 Sunday~Saturday:

go 复制代码
type Weekday int

const (
 Sunday Weekday = iota
 Monday
 Tuesday
 Wednesday
 Thursday
 Friday
 Saturday
)

这样,后续要使用 Sunday~Saturday 这些有类型枚举常量,必须匹配 Weekday 类型的变量。

相关推荐
astronautyi8 小时前
Go 运行时内存分配与 GC 位图深度剖析
开发语言·后端·golang
techdashen8 小时前
Go 中如何处理错误
开发语言·后端·golang
GoGeekBaird8 小时前
Agent 时代,你的生产环境,真的敢让它裸奔吗
后端·agent
IT_陈寒8 小时前
Redis Pipeline用错竟比不用还慢,这个坑我帮你踩过了
前端·人工智能·后端
名字还没想好☜9 小时前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
源代码•宸9 小时前
前置准备:定时微服务有什么价值
经验分享·后端·微服务·云原生·架构
catino9 小时前
高并发详解
后端
掘金者阿豪9 小时前
GPT-6 Astra 来了,GPT-5.6 Sol 还值得用吗?聊聊 Coding、百万上下文、价格和 Plus/Pro
前端·后端
SamDeepThinking9 小时前
HashMap 分组操作的演进:从三次查找到一次调用
java·后端·程序员
newerp9 小时前
Golang 接口的两副面孔:eface、iface 与动态派发之谜
后端·程序员·go