当前位置: 首页 > article >正文

go创建完美的枚举类型

文章目录

    • 一.前言
    • 二. 枚举基本要素描述
    • 三. 枚举设计源码
      • 3.1 EnumCommon-通用能力
      • 3.2 Enum_news 业务枚举
      • 3.3 定制化业务枚举


一.前言

用惯了springboot和Jakarta.才发现springboot和Jakarta的语言是多么精妙! 一些场景我们需要使用枚举: 如建立字典值映射,仅通过代码实现方便快捷; 维护自定义响应码; 维护下拉菜单选项 等.
需要注意的是go建立结构体应尽量避免使用基本数值类型,应当使用`基本数值类型指针`. 因为基本数值类型默认数值可能会与状态值冲突.前端传值无法判nil. 当然也可借助gin等三方框架的校验规则,亦或设置负值默认值.这里给出的是弱依赖,仅用go就能解决的方式....

二. 枚举基本要素描述

在java中我们发现枚举对象操作很方便.
    1. 具备基本包装类型
    1. 可以通过自定义方式快速使用 getKeyByVal
    1. 可以通过自定义方式快速使用 getValByKey
    1. 可以通过自定义方式快速使用 getEnumsList 获取枚举列表.

上述也是我们常用的方式. 那么我们将上述功能还原. 并且
由于go中 1.基本类型和状态值冲突问题 2. 性能考虑 使用指针类型

当然java有些功能太臃肿.比如对象.属性即可;
私有化属性. 通过对象.获取属性的方法()是个伪命题! 这边会优化掉.


三. 枚举设计源码

3.1 EnumCommon-通用能力

在此之前,需要对小白提醒下. go没有文件(类)的概念. go是基于文件夹(包) 来规划代码的.

enum_common.go

package enums

import "fmt"

// 用来处理枚举
type EnumCommon struct {
	Key   *int   `json:"key"`
	Value string `json:"value"`
}
// 用来返回枚举结果
type ReturnEnumCommon struct {
	Key   int    `json:"key"`
	Value string `json:"value"`
}

var (
	// 通用枚举
	UNDISPOSED = newEnumCommon(IntPtr(0), "未处理")
	PROCESSED  = newEnumCommon(IntPtr(1), "已处理")
)

// 包装枚举
func newEnumCommon(key *int, value string) *EnumCommon {
	return &EnumCommon{
		Key:   key,
		Value: value,
	}
}

// IntPtr 是一个辅助函数,用于创建 int 类型的指针  就是用来赋值的
func IntPtr(i int) *int {
	return &i
}

// GetEnumCommon 获取当前枚举  即
func (e *EnumCommon) GetEnumCommon() *EnumCommon {
	return &EnumCommon{
		Key:   e.Key,
		Value: e.Value,
	}
}

// 获取枚举列表
func GetEnumsList(arr []*EnumCommon) []ReturnEnumCommon {
	var temp []ReturnEnumCommon
	for i := 0; i < len(arr); i++ {
		temp = append(temp, ReturnEnumCommon{
			Key:   *arr[i].Key,
			Value: arr[i].Value,
		})
	}
	return temp
}

// GetValByKey 根据key获取val
func GetValByKey(key int, arr []*EnumCommon) string {
	for i := 0; i < len(arr); i++ {
		if key == *arr[i].Key {
			return arr[i].Value
		}
	}
	panic(fmt.Sprintf("未找到对应的枚举值."))
}

// GetKeyByVal 根据val获取key
func GetKeyByVal(value string, arr []*EnumCommon) int {
	for i := 0; i < len(arr); i++ {
		if value == arr[i].Value {
			return *arr[i].Key
		}
	}
	panic(fmt.Sprintf("未找对应的枚举key."))
}

3.2 Enum_news 业务枚举

方法调用了common中的

var (
	// 发布状态
	STATUS_STOP  = createEnum(IntPtr(0), "草稿")
	STATUS_WAIT  = createEnum(IntPtr(1), "审核")
	STATUS_ALLOW = createEnum(IntPtr(2), "发布")

	// 消息类型
	NEWS_JOURNALISM = createEnum(IntPtr(0), "新闻")
	NEWS_NOTICE     = createEnum(IntPtr(1), "公告")
	NEWS_CASE       = createEnum(IntPtr(2), "案例")

	// 消息格式
	STYLE_TEXT     = createEnum(IntPtr(0), "text")
	STYLE_HTML     = createEnum(IntPtr(1), "html")
	STYLE_MARKDOWN = createEnum(IntPtr(2), "markdown")
)

// 发布状态枚举遍历能力
var statusArray = []*EnumCommon{STATUS_STOP, STATUS_WAIT, STATUS_ALLOW}
var typeArray = []*EnumCommon{NEWS_JOURNALISM, NEWS_NOTICE, NEWS_CASE}
var styleArray = []*EnumCommon{STYLE_TEXT, STYLE_HTML, STYLE_MARKDOWN}

// GetEnumNewsStatus 获取枚举对象
func GetEnumNewsStatus() []ReturnEnumCommon {
	return GetEnumsList(statusArray)
}
func GetEnumNewsType() []ReturnEnumCommon {
	return GetEnumsList(typeArray)
}
func GetEnumNewsStyle() []ReturnEnumCommon {
	return GetEnumsList(styleArray)
}

// GetValByNewsStatusKey 获取枚举value by key
func GetValByNewsStatusKey(k int) string {
	return GetValByKey(k, statusArray)
}
func GetValByNewsTypeKey(k int) string {
	return GetValByKey(k, typeArray)
}
func GetValByNewsStyleKey(k int) string {
	return GetValByKey(k, styleArray)
}

// GetKeyByNewsStatusVal 获取枚举key by value
func GetKeyByNewsStatusVal(val string) int {
	return GetKeyByVal(val, statusArray)
}
func GetKeyByNewsTypeVal(val string) int {
	return GetKeyByVal(val, typeArray)
}
func GetKeyByNewsStyleVal(val string) int {
	return GetKeyByVal(val, styleArray)
}

部分测试结果
在这里插入图片描述

3.3 定制化业务枚举

比如自定义错误码枚举,通用能力用不了多少.
demo如下

package enums

type MyError struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

var (
	LOGIN_UNKNOWN = newError(202, "用户不存在")
	LOGIN_ERROR   = newError(203, "账号或密码错误")
	VALID_ERROR   = newError(300, "参数错误")
	OPTIONS_ERROR = newError(400, "操作失败")
	UNAUTHORIZED  = newError(401, "您还未登录")
	NOT_FOUND     = newError(404, "资源不存在")
	SYSTEM_ERROR  = newError(500, "系统发生异常")
)

func newError(code int, msg string) *MyError {
	return &MyError{
		Msg:  msg,
		Code: code,
	}
}

func (e *MyError) Error() string {
	return e.Msg
}

func (e *MyError) GetError(data interface{}) *MyError {
	return &MyError{
		Msg:  e.Msg,
		Code: e.Code,
		Data: data,
	}
}


http://www.kler.cn/a/104175.html

相关文章:

  • 保存 uboot图像配置
  • 依靠继承与聚合,实现maven搭建分布式项目
  • 视频常见问题(四):视频花屏和绿屏
  • PCIe架构的处理器系统介绍
  • Redis快速上手篇(四)(Spring Cache,缓存配置)(注解方式)
  • Android Kotlin 协程初探 | 京东物流技术团队
  • 父子项目打包发布至私仓库
  • 计算机视觉与深度学习 | 非线性优化理论:图优化、高斯牛顿法和列文伯格-马夸尔特算法
  • k8s中kubectl陈述式资源管理
  • (九)QVTKOpenGLNativeWidget同时显示点云和模型
  • kafka3.X集群安装(不使用zookeeper)
  • Django分页功能的使用和自定义分装
  • Fastq文件的获取
  • 小学数学作业练习册出题网站源码_支持打印转成PDF
  • On Moving Object Segmentation from Monocular Video with Transformers 论文阅读
  • ajax请求的时候get 和post方式的区别?
  • 漏洞复现--用友 畅捷通T+ .net反序列化RCE
  • 【23种设计模式】里氏替换原则
  • (完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类
  • 华纳云:网络dns配置异常怎么处理