Go 语言枚举类型(iota自增)

更新时间 2022-03-31 14:52:43

一则小广告

最近,小哈正在带小伙伴做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4,手把手教学,前端 + 后端全栈开发,从 0 到 1 讲解每个功能开发过程,1v1 答疑,陪伴式直到项目上线,目前第六章 《Element Plus 手搭 Admin 后台管理骨架》已快完结,截止到目前,已更新 52 节内容,共计 81557 字,演示截图:433 张,持续更新中,后续还会上新更多项目,欢迎点击加入

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

图示:

go语言枚举代码示例2go语言枚举代码示例2

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

图示:

go语言枚举代码示例go语言枚举代码示例