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 enumsimport "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 []ReturnEnumCommonfor 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 enumstype 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.rhkb.cn/news/171837.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)

系统介绍 黑果魏叔苹果今天为 macOS Sonoma 推出了 14.1 版本更新&#xff0c;魏叔发现&#xff0c;本更新主要改善了 Apple Music 界面&#xff0c;设置中新增保修状态&#xff0c;并修复了多项错误内容。 根据苹果的新说明&#xff0c;这次的 Mac 更新不仅提供了一系列的改善…

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…

IT新人如何在职场弯道超车?强推荐考取当下最有价值的云计算认证证书!

疯狂的裁员&#xff01;股价降低&#xff01;在美国&#xff0c;一股寒冷的创业寒流正在席卷而来。不只是硅谷进入了冬天&#xff0c;国内的传统互联网寒潮也凛冽地来了。在传统 IT体系结构逐渐式微、产业规模不断缩小的情况下&#xff0c;许多 IT工程师都面临着下岗、跳槽等问…

vmware17.0|ubuntu22.04.0 解决灰色Vmware Tool 无法重新安装和 无法和win11相互拖拽文件问题

文章目录 版本&#xff1a;问题&#xff1a;解决方法 版本&#xff1a; vmware 17.0 ubuntu 22.04.0 win11 问题&#xff1a; 无法和windows互相复制粘贴文件 解决方法 1.关闭虚拟机 2.开启虚拟机&#xff0c;在开启虚拟机的过程中再次查看发现灰色图标可点击&#xff0c…

TSINGSEE青犀睡岗离岗检测算法——确保加油站安全运营

众所周知&#xff0c;加油站是一个需要24小时营业的场所&#xff0c;由于夜间加油人员较少&#xff0c;员工极易处于疲劳或者睡眠状态&#xff0c;为保障安全和效率&#xff0c;通过TSINGSEE青犀睡岗离岗检测算法在加油站场景中&#xff0c;可以及时发现工作人员的疲劳状况&…

JVM性能优化 —— 类加载器,手动实现类的热加载

一、类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑&#xff0c;这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件&#xff0c;”.class”文件中保存着Java代码经转换后的虚拟机指令&#xff0c;当需要使用某个类时&#…

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…

面试算法43:在完全二叉树中添加节点

题目 在完全二叉树中&#xff0c;除最后一层之外其他层的节点都是满的&#xff08;第n层有2n-1个节点&#xff09;。最后一层的节点可能不满&#xff0c;该层所有的节点尽可能向左边靠拢。例如&#xff0c;图7.3中的4棵二叉树均为完全二叉树。实现数据结构CBTInserter有如下3种…

ubuntu扩大运行内存, 防止编译卡死

首先查看交换分区大小 grep SwapTotal /proc/meminfo 1、关闭交换空间 sudo swapoff -a 2、扩充交换空间大小&#xff0c;count64就是64G 1G x 64 sudo dd if/dev/zero of/swapfile bs1G count64 3、设置权限 sudo chmod 600 /swapfile 4、指定交换空间对应的设备文件 …

Linux区分文件类型,file指令,目录权限,umask掩码,共享文件,Linux中的一些有趣指令

file指令&#xff0c;Linux区分文件类型&#xff0c;目录权限&#xff0c;umask掩码&#xff0c;共享文件&#xff0c;Linux中的一些有趣指令 1.Linux中是如何区分文件类型的2. file指令3.目录权限4.umask掩码5.粘滞位6.Linux中的一些有趣指令 所属专栏&#xff1a;Linux学习❤…

ubuntu执行普通用户或root用户执行apt-get update时报错Couldn‘t create temporary file /tmp/...

apt-get update无法更新&#xff0c;报错&#xff1a; Couldnt create temporary file /tmp/apt.conf.GSzv74 for passing config to&#xff0c;&#xff0c;&#xff0c; 这是由于/tmp目录没有权限导致的&#xff0c;解决办法&#xff1a; chmod 777 /tmp

Python 算法高级篇:桶排序与基数排序

Python 算法高级篇&#xff1a;桶排序与基数排序 引言什么是桶排序&#xff1f;桶排序的基本步骤桶排序的示例 什么是基数排序&#xff1f;基数排序的基本步骤基数排序的示例 桶排序与基数排序的应用桶排序的应用基数排序的应用 Python 示例代码总结 引言 在算法高级篇的课程中…

缓解光纤激光切割机老化之如何保养光纤激光切割机的光学镜片

激光切割头具备极高的精密度和昂贵的价格&#xff0c;是光纤激光切割机最关键的运行部分之一。在日常的光纤激光切割机维修过程中频繁出现的关于切割头使用寿命的问题就是内部光学镜片的污染及损坏。 部分导致光纤激光切割机激光切割头光学镜片污染的原因主要包括&#xff1a;对…

ant design vue 的getPopupContainer

在 ant design vue 中&#xff0c;有几个组件是有 getPopupContainer 属性的&#xff0c;比如&#xff1a;下拉菜单 默认是渲染到body 上的&#xff0c;所以如果你想要对 下拉选择组件 的样式&#xff0c;做修改&#xff0c;如果 style 标签上开启了 scoped&#xff0c;肯定不会…

redis6.0源码分析:字典扩容与渐进式rehash

文章目录 字典数据结构结构设计dictType字典类型为什么字典有两个哈希表&#xff1f;哈希算法 扩容机制扩容前置知识字典存在几种状态&#xff1f;容量相关的关键字段定义字典的容量都是2的幂次方 扩容机制字典什么时候会扩容&#xff1f;扩容的阈值 & 扩容的倍数哪些方法会…

STM32 ADC数模转换器

STM32 ADC数模转换器 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 STM32主要是数字电路&#xff0c;数字电路只有高低电平&#xf…

Node.js 的适用场景

目录 ​编辑 前言 适用场景 1. 实时应用 用法 代码 理解 2. API 服务器 用法 代码示例 理解 3. 微服务架构 用法 代码示例 理解 总结 前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使得 JavaScript 可以脱离浏览器运行在服务器…

2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码

2023妈妈杯数学建模B题完整版思路、模型代码已出&#xff01;&#xff01;&#xff01; 云顶数模最新完整版解题思路、模型代码&#xff0c;供大家参考~~ B题目 解题思路 详细模型解析&#xff1a;

从零开始的LINUX(三)

bc&#xff1a;进行浮点数运算 uname&#xff1a;查看当前的操作系统 ctrlc&#xff1a;中止当前正在执行的程序 ctrld&#xff1a;退出xshell shutdown&#xff1a;关机 reboot&#xff1a;重启 shell外壳&#xff1a; 作用&#xff1a;1、命令解释&#xff08;将输入的程序…

高速下载b站视频的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…