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 类型的变量。

相关推荐
还在忙碌的吴小二1 天前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring
三分恶1 天前
支付江湖路—第一章:支付溯源——从贝壳到比特
后端
武子康1 天前
大数据-264 实时数仓-MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
倾颜1 天前
接入 MCP,不一定要先平台化:一次 AI Runtime 的实战取舍
前端·后端·mcp
wechat_Neal1 天前
Golang的车载应用场景
开发语言·后端·golang
Moment1 天前
AI全栈入门指南:一文搞清楚NestJs 中的 Controller 和路由
前端·javascript·后端
GetcharZp1 天前
告别繁琐配置!这款 Go 写的 Web 服务器,凭什么让 Nginx 都不香了?
后端
IT_陈寒1 天前
Python的asyncio把我整不会了,原来问题出在这儿
前端·人工智能·后端
武子康1 天前
大数据-265 实时数仓-Canal MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
清心歌1 天前
记一次系统环境变量更改后在IDEA中无法读取新值的排查过程
java·后端·intellij-idea·idea