【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

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

相关推荐
油泼辣子多加1 小时前
2024年11月22日Github流行趋势
github
ifanatic3 小时前
[面试]-golang基础面试题总结
面试·职场和发展·golang
懒是一种态度3 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
XINGTECODE3 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
入 梦皆星河3 小时前
在 Ubuntu/Debian 上安装 Go
ubuntu·golang·debian
和你一起去月球4 小时前
TypeScript - 函数(下)
javascript·git·typescript
凡人的AI工具箱4 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
我不是程序猿儿4 小时前
【GIT】TortoiseGit的变基(Rebase)操作
git
yyycqupt11 小时前
git使用(一)
git