Go 语言枚举类型(iota自增)
一则或许对你有用的小广告
欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书
《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于
Spring AI + Spring Boot 3.x + JDK 21...,查看介绍《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,查看介绍;演示链接:http://116.62.199.48:7070/《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/
新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍
截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观
Go 语言中其实是没有枚举类型的,但是,可以使用常量 iota 来模拟枚举。
一、Go 语言定义枚举类型
下面这段代码,我们尝试定义一个性别枚举:
package main
import "fmt"
// 定义一个名为 Sex 类型, 实际类型为 int
type Sex int
// 定义性别男女
const (
Woman Sex = iota // 将枚举值 Woman 定义为 Sex 类型,并搭配 iota 开始生成枚举值,默认从 0 开始
Man
)
func main() {
// 输出枚举值
fmt.Println(Woman, Man)
// 使用枚举类型,并赋值
var sex Sex = Man
fmt.Println(sex)
}
代码输出如下:
0 1
1
图示:
const 声明内的每一行常量声明,将会自动套用前面 iota 格式,并自动增加。有点类似于 Excel 表格自动填充功能。
也就是说,第一行 Woman 枚举值定义了 0, 那么 Man 的值会自动加一,值变成了1。
当然,iota 除了每次自增 1 以外,我们还可以利用 iota 来完成一些更复杂的操作。下面这段代码用来生成一些标志位:
package main
import "fmt"
const (
Flag1 = 1 << iota // 移位操作,左移一位
Flag2
Flag3
Flag4
)
func main() {
// 输出枚举整型值
fmt.Printf("%d %d %d %d\n", Flag1, Flag2, Flag3, Flag4)
// 输出枚举二进制格式的值
fmt.Printf("%b %b %b %b", Flag1, Flag2, Flag3, Flag4)
}
代码输出如下:
1 2 4 8
1 10 100 1000
二、Go 语言枚举值装换字符串
在实际应用场景中,通常需要获取枚举值对应的字符串 描述。
Go 语言中,我们可以这样做:
package main
import "fmt"
// 定义一个名为 Sex 类型
type Sex int
const (
Woman Sex = iota // 开始生成枚举值,默认从 0 开始
Man
)
// 定义一个 Sex 类型的方法 String(), 返回字符串
func (s Sex) String() string {
switch s {
case Woman:
return "女"
case Man:
return "男"
}
return "N/A"
}
func main() {
// 输出枚举 Woman 的字符串描述,以及整型值
fmt.Printf("%s %d", Woman, Woman)
}
一旦某个类型需要输出字符串时,Go 语言 会自动寻找
String()方法并调用。
代码输出:
女 0
图示:
