【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

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

相关推荐
running up6 小时前
Github 首页美化教程
github
草梅友仁11 小时前
草梅 Auth 1.12.0 发布与墨梅博客立项经验 | 2025 年第 50 周草梅周报
开源·github·ai编程
不会写DN13 小时前
fmt 包中的所有 Print 系列函数
开发语言·后端·golang·go
一勺-_-13 小时前
.git文件夹
大数据·git·elasticsearch
雪域迷影14 小时前
Windows11中使用VS2022编译运行libevent网络库
网络·github·cmake·visual studio·libevent
小明的小名叫小明14 小时前
Go从入门到精通(28) -再谈GMP和starvation
网络·golang
likeshop 好像科技15 小时前
新手学习AI智能体Agent逻辑设计的指引
人工智能·学习·开源·github
TT哇15 小时前
【git】本地代码上传到gitee仓库(保姆级教程)idea和vscode等通用
git·gitee·intellij-idea
人在旅途我渐行渐远15 小时前
idea 通过git撤销commit但未push的操作
java·git·intellij-idea
Serene_Dream15 小时前
IDEA中多人项目中如何将自己的本地分支调整到远程的最新分支下
git·github