【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.
💻代码
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使用示例
星期
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!
颜色
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
💪无人扶我青云志,我自踏雪至山巅。