【go从零单排】实现枚举类型(Enum)

🌈Don't worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在Go语言中,并没有内置的枚举类型(Enum),但可以通过自定义类型和常量组合来实现类似于枚举的功能。下面将详细介绍如何在Go中模拟枚举,包括定义、使用和一些常见的模式。

Go doesn't have an enum type as a distinct language feature, but enums are simple to implement using existing language idioms.

💻代码

go 复制代码
package main

import "fmt"

// type关键字定义ServerState类型,基本类型为int
type ServerState int

// 使用 iota 定义了一组常量,分别表示不同的服务器状态
// iota 是一个特殊的预定义标识符,用于简化常量的定义。每次使用 iota 时,它会从0开始自动递增
const (
	StateIdle ServerState = iota
	StateConnected
	StateError
	StateRetrying
)

// 定义了一个映射 stateName,将 ServerState 的值映射到对应的字符串名称
var stateName = map[ServerState]string{
	StateIdle:      "idle",
	StateConnected: "connected",
	StateError:     "error",
	StateRetrying:  "retrying",
}

// 为 ServerState 类型实现了一个 String() 方法,将 ServerState 类型的值转换为字符串。
// 当使用 fmt.Println 输出 ServerState 类型的值时,会自动调用这个方法。
func (ss ServerState) String() string {
	return stateName[ss]
}

// 调用 transition 函数,将 StateIdle 作为参数传入,并打印返回的状态 ns
func main() {
	ns := transition(StateIdle)
	fmt.Println(ns)

	ns2 := transition(ns)
	fmt.Println(ns2)
}

// ransition 函数根据传入的状态 s 返回指定的状态
func transition(s ServerState) ServerState {
	switch s {
	//传入StateIdle返回StateConnected
	case StateIdle:
		return StateConnected
	case StateConnected, StateRetrying:
		return StateIdle
	case StateError:
		return StateError
	default:
		//如果传入的状态不在已定义的状态中,则触发 panic,输出错误信息
		panic(fmt.Errorf("unknown state: %s", s))
	}
}

输出

复制代码
go run post.go
connected
idle

🔍理解

  • 这段代码定义了一个服务器状态的状态机,使用自定义类型和常量来表示不同的状态,并通过映射将状态与其名称关联。
  • 通过实现 String() 方法,可以方便地输出状态的字符串表示。
  • transition 函数实现了状态之间的转换逻辑,展示了如何根据当前状态决定下一状态。
  • 在 main 函数中,展示了如何使用状态机进行状态转换并输出结果。

💡 iota使用示例

星期

go 复制代码
package main

import "fmt"

// 定义一个自定义类型
type Day int

// 使用 iota 定义常量
const (
	Sunday Day = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

// 实现 String() 方法以便于打印
func (d Day) String() string {
	return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[d]
}

func main() {
	// 使用枚举
	today := Monday
	fmt.Println("Today is:", today)

	// 也可以进行比较
	if today == Monday {
		fmt.Println("It's the start of the work week!")
	}
}

//输出
//Today is: Monday
//It's the start of the work week!

颜色

go 复制代码
package main

import "fmt"

type Color int

const (
	Red Color = iota
	Green
	Blue
)

func (c Color) String() string {
	return [...]string{"Red", "Green", "Blue"}[c]
}

func main() {
	favoriteColor := Green
	fmt.Println("Favorite color is:", favoriteColor)
}

//输出
//Favorite color is: Green

💪无人扶我青云志,我自踏雪至山巅。

相关推荐
不爱洗脚的小滕43 分钟前
【Redis】三种缓存问题(穿透、击穿、双删)的 Golang 实践
redis·缓存·golang
sulikey2 小时前
从零配置一个规范的 Python Git 仓库(适用于 Gitee / GitHub)
git·python·pycharm·gitee·github
whysqwhw2 小时前
KuiklyUI声明式组件体系的实现分析
github
whysqwhw3 小时前
ComposeView 的上下游继承关系及相关类/接口分析
github
逛逛GitHub4 小时前
登上 GitHub 热榜!一口气调用多个 AI 大模型开源神器。
github
21号 15 小时前
4.客户端(Redis)
开发语言·数据库·github
学渣676565 小时前
【面向小白】git rebase全面总结,什么时候用rebase
git
梦想CAD控件5 小时前
网页CAD中组(Group)功能的二次开发
前端·javascript·github
米诺zuo6 小时前
不同的项目仓库配置不同的github账号
github
小龙报6 小时前
《算法每日一题(1)--- 第31场蓝桥算法挑战赛》
c语言·开发语言·c++·git·算法·学习方法