您现在的位置是:首页 > 编程 > 

Go程序设计(22):枚举

2025-07-28 20:18:20
Go程序设计(22):枚举 枚举类型(enum)是和类型的一个特殊情况。枚举是一种具有固定数量可能值的类型,每个值都有唯一的名称。Go 语言没有专门的枚举类型作为独立的语言特性,但可以通过现有的语言惯用法轻松实现枚举。代码语言:go复制package main import "fmt" // 我们的枚举类型 ServerState 以 int 类型作为底层类型。 type S

Go程序设计(22):枚举

枚举类型(enum)是和类型的一个特殊情况。枚举是一种具有固定数量可能值的类型,每个值都有唯一的名称。Go 语言没有专门的枚举类型作为独立的语言特性,但可以通过现有的语言惯用法轻松实现枚举。

代码语言:go复制
package main

import "fmt"
// 我们的枚举类型 ServerState 以 int 类型作为底层类型。
type ServerState int
// ServerState 的可能取值通过常量定义。特殊关键字 iota 会自动生成连续的常量值,在这种情况下分别为 0、1、2 等。
ct (
    StateIdle ServerState = iota
    StateConnected
    StateError
    StateRetrying
)
// 通过实现 fmt.Stringer 接口,ServerState 的值可以被打印或转换为字符串。如果可能的值很多,实现起来会变得繁琐。在这种情况下,可以结合 stringer 工具和 go:generate 指令来自动化该过程。有关详细解释,请参阅[这篇文章](/blog/generate)。
var stateame = map[ServerState]string{
    StateIdle:      "idle",
    StateConnected: "connected",
    StateError:     "error",
    StateRetrying:  "retrying",
}

func (ss ServerState) String() string {
    return stateame[ss]
}

func main() {
	// 如果我们有一个 int 类型的值,无法将其直接传递给 transition 函数——编译器会提示类型不匹配。这为枚举提供了一定程度的编译时类型安全。
    ns := transition(StateIdle)
    fmt.Println(ns)

    ns2 := transition(ns)
    fmt.Println(ns2)
}
// transition 模拟服务器的状态转换;它接受当前状态并返回一个新状态。
func transition(s ServerState) ServerState {
    switch s {
    case StateIdle:
        return StateConnected
    case StateConnected, StateRetrying:
		// 假设我们在这里检查一些谓词来确定下一个状态…… 
        return StateIdle
    case StateError:
        return StateError
    default:
        panic(fmt.Errorf("unknown state: %s", s))
    }
}

运行结果:

代码语言:javascript代码运行次数:0运行复制
$ go run enums.go
connected
idle

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1261361.html

相关标签:无
上传时间: 2025-07-28 08:26:26
留言与评论(共有 5 条评论)
本站网友 山东化工厂爆炸
19分钟前 发表
1
本站网友 太仓二手房出售
26分钟前 发表
请参阅[这篇文章](/blog/generate)
本站网友 期货基础知识
21分钟前 发表
panic(fmt.Errorf("unknown state
本站网友 中脘穴
26分钟前 发表
panic(fmt.Errorf("unknown state