Go 原生枚举元数据管理,支持泛型类型和索引集合。
🎯 类型安全枚举: 泛型枚举描述符,将自定义元数据绑定到 Go 原生枚举 ⚡ 快速查找: O(1) 索引集合,基于 code 搜索 🔄 灵活元数据: 支持超越字符串描述的自定义元数据类型 🌍 默认值处理: 可配置的默认值,支持链式配置 📋 验证支持: 内置方法检查枚举存在性和有效性
go get github.com/yylego/enumpackage main
import (
"fmt"
"github.com/yylego/enum"
)
func main() {
type Status string
const (
Unknown Status = "unknown"
Success Status = "success"
Failure Status = "failure"
)
// 创建无元数据的索引集合
enums := enum.NewEnums(
enum.NewEnum(Unknown),
enum.NewEnum(Success),
enum.NewEnum(Failure),
)
// O(1) 使用 code 查找
if res, ok := enums.Lookup(Success); ok {
fmt.Println(res.Code()) // 输出: success
}
// 获取时带默认值回退
result := enums.Get(Status("not_exists"))
fmt.Println(result.Code()) // 输出: unknown (默认值)
// 列出所有 code
fmt.Println(enums.List()) // 输出: [unknown success failure]
}⬆️ 源码: Source
package main
import (
"fmt"
"github.com/yylego/enum"
)
func main() {
type Status string
const (
Unknown Status = "unknown"
Success Status = "success"
Failure Status = "failure"
)
// 创建带描述的索引集合
enums := enum.NewEnums(
enum.NewEnumWithDesc(Unknown, "未知状态"),
enum.NewEnumWithDesc(Success, "成功状态"),
enum.NewEnumWithDesc(Failure, "失败状态"),
)
// O(1) 使用 code 查找
if res, ok := enums.Lookup(Success); ok {
fmt.Println(res.Code()) // 输出: success
fmt.Println(res.Meta().Desc()) // 输出: 成功状态
}
// 获取时带默认值回退
result := enums.Get(Status("not_exists"))
fmt.Println(result.Code()) // 输出: unknown (默认值)
fmt.Println(result.Meta().Desc()) // 输出: 未知状态
}⬆️ 源码: Source
package main
import (
"fmt"
"github.com/yylego/enum"
)
type MetaInfo struct {
HTTPCode int
Message string
}
func main() {
type Status string
const (
Unknown Status = "unknown"
Success Status = "success"
Failure Status = "failure"
)
// 创建带自定义元数据的索引集合
enums := enum.NewEnums(
enum.NewEnumWithMeta(Unknown, &MetaInfo{HTTPCode: 0, Message: "未知"}),
enum.NewEnumWithMeta(Success, &MetaInfo{HTTPCode: 200, Message: "成功"}),
enum.NewEnumWithMeta(Failure, &MetaInfo{HTTPCode: 500, Message: "错误"}),
)
// O(1) 使用 code 查找
if res, ok := enums.Lookup(Success); ok {
fmt.Println(res.Code()) // 输出: success
fmt.Println(res.Meta().HTTPCode) // 输出: 200
fmt.Println(res.Meta().Message) // 输出: 成功
}
// 获取时带默认值回退
result := enums.Get(Status("not_exists"))
fmt.Println(result.Code()) // 输出: unknown (默认值)
fmt.Println(result.Meta().HTTPCode) // 输出: 0
fmt.Println(result.Meta().Message) // 输出: 未知
}⬆️ 源码: Source
| 函数 | 描述 |
|---|---|
NewEnum(code) |
创建无元数据的枚举 |
NewEnumWithDesc(code, desc) |
创建带字符串描述的枚举 |
NewEnumWithMeta(code, meta) |
创建带自定义元数据类型的枚举 |
| 方法 | 描述 |
|---|---|
Code() |
获取 Go 原生枚举值 |
Meta() |
获取关联的元数据 |
| 函数 | 描述 |
|---|---|
NewEnums(params...) |
从枚举实例创建索引集合 |
| 方法 | 描述 |
|---|---|
Lookup(code) |
查找枚举,返回 (枚举, 是否存在) |
Get(code) |
查找枚举,未找到时返回默认值 |
MustGet(code) |
查找枚举,未找到时 panic |
| 方法 | 描述 |
|---|---|
List() |
按定义顺序获取枚举 code 切片 |
ListValid() |
获取排除默认值的 code(除非标记为有效) |
| 方法 | 描述 |
|---|---|
GetDefault() |
获取默认枚举实例 |
GetDefaultCode() |
获取默认枚举 code 值 |
SetDefault(enum) |
设置默认枚举实例 |
SetDefaultCode(code) |
使用 code 值设置默认值 |
SetDefaultValid(valid) |
在 Valid() 中标记默认值为有效 |
UnsetDefault() |
移除默认值 |
| 方法 | 描述 |
|---|---|
WithDefault(enum) |
设置默认值并返回集合 |
WithDefaultCode(code) |
使用 code 设置默认值并返回集合 |
WithDefaultValid(valid) |
设置有效状态并返回集合 |
WithUnsetDefault() |
移除默认值并返回集合 |
MIT 许可证 - 详见 LICENSE。
非常欢迎贡献代码!报告 BUG、建议功能、贡献代码:
- 🐛 问题报告? 在 GitHub 上提交问题并附上重现步骤
- 💡 新颖思路? 创建 issue 讨论
- 📖 文档疑惑? 报告问题,帮助我们完善文档
- 🚀 需要功能? 分享使用场景,帮助理解需求
- ⚡ 性能瓶颈? 报告慢操作,协助解决性能问题
- 🔧 配置困扰? 询问复杂设置的相关问题
- 📢 关注进展? 关注仓库以获取新版本和功能
- 🌟 成功案例? 分享这个包如何改善工作流程
- 💬 反馈意见? 欢迎提出建议和意见
新代码贡献,请遵循此流程:
- Fork:在 GitHub 上 Fork 仓库(使用网页界面)
- 克隆:克隆 Fork 的项目(
git clone https://github.com/yourname/repo-name.git) - 导航:进入克隆的项目(
cd repo-name) - 分支:创建功能分支(
git checkout -b feature/xxx) - 编码:实现您的更改并编写全面的测试
- 测试:(Golang 项目)确保测试通过(
go test ./...)并遵循 Go 代码风格约定 - 文档:面向用户的更改需要更新文档
- 暂存:暂存更改(
git add .) - 提交:提交更改(
git commit -m "Add feature xxx")确保向后兼容的代码 - 推送:推送到分支(
git push origin feature/xxx) - PR:在 GitHub 上打开 Merge Request(在 GitHub 网页上)并提供详细描述
请确保测试通过并包含相关的文档更新。
非常欢迎通过提交 Merge Request 和报告问题来贡献此项目。
项目支持:
- ⭐ 给予星标如果项目对您有帮助
- 🤝 分享项目给团队成员和(golang)编程朋友
- 📝 撰写博客关于开发工具和工作流程 - 我们提供写作支持
- 🌟 加入生态 - 致力于支持开源和(golang)开发场景
祝你用这个包编程愉快! 🎉🎉🎉