Skip to content

Latest commit

 

History

History
290 lines (213 loc) · 8.2 KB

File metadata and controls

290 lines (213 loc) · 8.2 KB

GitHub Workflow Status (branch) GoDoc Coverage Status Supported Go Versions GitHub Release Go Report Card

enum

Go 原生枚举元数据管理,支持泛型类型和索引集合。


英文文档

ENGLISH README

核心特性

🎯 类型安全枚举: 泛型枚举描述符,将自定义元数据绑定到 Go 原生枚举 ⚡ 快速查找: O(1) 索引集合,基于 code 搜索 🔄 灵活元数据: 支持超越字符串描述的自定义元数据类型 🌍 默认值处理: 可配置的默认值,支持链式配置 📋 验证支持: 内置方法检查枚举存在性和有效性

安装

go get github.com/yylego/enum

使用方法

基本枚举集合

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.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

API 参考

枚举创建

函数 描述
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 讨论
  • 📖 文档疑惑? 报告问题,帮助我们完善文档
  • 🚀 需要功能? 分享使用场景,帮助理解需求
  • 性能瓶颈? 报告慢操作,协助解决性能问题
  • 🔧 配置困扰? 询问复杂设置的相关问题
  • 📢 关注进展? 关注仓库以获取新版本和功能
  • 🌟 成功案例? 分享这个包如何改善工作流程
  • 💬 反馈意见? 欢迎提出建议和意见

🔧 代码贡献

新代码贡献,请遵循此流程:

  1. Fork:在 GitHub 上 Fork 仓库(使用网页界面)
  2. 克隆:克隆 Fork 的项目(git clone https://github.com/yourname/repo-name.git
  3. 导航:进入克隆的项目(cd repo-name
  4. 分支:创建功能分支(git checkout -b feature/xxx
  5. 编码:实现您的更改并编写全面的测试
  6. 测试:(Golang 项目)确保测试通过(go test ./...)并遵循 Go 代码风格约定
  7. 文档:面向用户的更改需要更新文档
  8. 暂存:暂存更改(git add .
  9. 提交:提交更改(git commit -m "Add feature xxx")确保向后兼容的代码
  10. 推送:推送到分支(git push origin feature/xxx
  11. PR:在 GitHub 上打开 Merge Request(在 GitHub 网页上)并提供详细描述

请确保测试通过并包含相关的文档更新。


🌟 项目支持

非常欢迎通过提交 Merge Request 和报告问题来贡献此项目。

项目支持:

  • 给予星标如果项目对您有帮助
  • 🤝 分享项目给团队成员和(golang)编程朋友
  • 📝 撰写博客关于开发工具和工作流程 - 我们提供写作支持
  • 🌟 加入生态 - 致力于支持开源和(golang)开发场景

祝你用这个包编程愉快! 🎉🎉🎉


GitHub 标星点赞

Stargazers