【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

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

相关推荐
yylの博客2 小时前
Windows通过git-bash安装zsh
windows·git·bash·zsh
丁总学Java3 小时前
(Z Shell)zsh: no matches found: ? 使用单引号包裹
git·zsh
萌狼蓝天3 小时前
【NAS】绿联NAS+极狐Gitlab+1Panel
git
玖疯子5 小时前
如何详细地遵循RustDesk的步骤来搭建远程访问和自定义服务器?
github
小华同学ai6 小时前
ShowDoc:Star12.3k,福利项目,个人小团队的在线文档“简单、易用、轻量化”还专门针对API文档、技术文档做了优化
前端·程序员·github
hkNaruto8 小时前
【P2P】【Go】采用go语言实现udp hole punching 打洞 传输速度测试 ping测试
golang·udp·p2p
入 梦皆星河8 小时前
go中常用的处理json的库
golang
deja vu水中芭蕾8 小时前
git push origin HEAD:refs/for/分支名
git
海绵波波10710 小时前
Gin-vue-admin(2):项目初始化
vue.js·golang·gin
每天写点bug10 小时前
【go每日一题】:并发任务调度器
开发语言·后端·golang