【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

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

相关推荐
逛逛GitHub8 小时前
慢慢吃掉你的 Claude Code,在终端里养一只黑洞。
github
jump_jump14 小时前
为了重玩金庸群侠传,我研究了一下 Ruffle 怎么复活 Flash
游戏·rust·github
LinXunFeng1 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
DayDaydream1 天前
7 天涨了 8000+ Star,Agent Reach 想给 AI 装上互联网眼睛
github
天衍四九3 天前
Git从0到实战(四):冲突解决与版本回退 —— 别怕,出错了也能救
github
大刚测试开发实战3 天前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
uhakadotcom3 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
Avan_菜菜4 天前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程
逛逛GitHub4 天前
这个爆红的 GitHub 项目让 token 直接省 60–95%。
github
iccb10134 天前
5年,一个程序员是如何把私有化在线客服系统做到第一名的
前端·后端·github