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.mzph.cn/news/118994.shtml

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

相关文章

竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…

用Flask快速生成报表

一、前言 《用Python快速生成报表之一》 我们介绍了用html-table快速生成表格数据报表&#xff0c;今天我们再介绍一下用Python Flask 快速开发报表&#xff0c;使用的是最古老的套页面方式。 二、Flask快速生成报表 Python有N多Web框架&#xff0c;最强大最出名的是Django&…

某全球领先的晶圆代工企业:替代FTP实现大规模文件的高效传输

全球领先的集成电路晶圆代工企业之一 该企业不仅是全球领先的集成电路晶圆代工企业之一&#xff0c;也是中国内地技术最先进、配套最完善、规模最大、跨国经营的集成电路制造企业集团。主要业务是根据客户本身或第三者的集成电路设计&#xff0c;为客户制造集成电路芯片&#…

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考&#xff1a; Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png…

IBM展示非冯·诺依曼架构AI芯片NorthPole

我们正处于人工智能的“寒武纪大爆发”时期。在过去的十年中&#xff0c;人工智能已经从理论和小型测试发展到企业规模的使用案例。但是&#xff0c;用于运行人工智能系统的硬件虽然越来越强大&#xff0c;但在设计时却没有考虑到当今的人工智能。随着人工智能系统规模的扩大&a…

3ds Max2023安装教程(最新最详细)

目录 一.简介 二.安装步骤 软件&#xff1a;3ds Max版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;6.85G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU3GHz 内存16G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a; …

Vue中的加密方式(js-base64、crypto-js、jsencrypt、bcryptjs)

目录 1.安装js-base64库 2. 在Vue组件中引入js-base64库 3.使用js-base64库进行加密 4.Vue中其他加密方式 1.crypto-js 2.jsencrypt 3.bcryptjs 1.安装js-base64库 npm install js-base64 --save-dev 2. 在Vue组件中引入js-base64库 import { Base64 } from js-ba…

Shopee买家通系统全自动化操作简单方便又快速

Shopee买家通系统是一款专门针对虾皮买家号所开发的全自动化操作系统&#xff0c;可以自动注册、自动加购加心愿单、自动下单等。 1、全自动化注册 准备好账号需要的资料后即可运行注册任务&#xff0c;程序运行时可以自动输入手机号、自动接收短信、自动输入账号密码。账号支…

用Visual Studio(VS)开发UNIX/Linux项目

目录 FTP是免不了的 正确设置头文件 组织项目结构 创建何种项目类型 FTP自动上传 大部分具有Windows开发经验的程序员会比较喜欢使用Visual Studio&#xff0c;而大部分Unix/Linux程序员则喜欢使用UltraEdit直接在主机上写代码。 为什么直接在主机上写代码呢&#xff0c;因…

FlutterUnit 周边 | 收录排序算法可视化

theme: cyanosis 1. FlutterUnit 更新&#xff1a;排序算法可视化 排序算法可视化是用视图层表现出算法执行过程中排序的过程&#xff0c;感谢 编程的平行世界 在 《十几种排序算法的可视化效果&#xff0c;快来看看&#xff01;&#x1f440;》》 一文中提供的算法支持。我进行…

单目3D目标检测[基于深度辅助篇]

基于深度辅助的方法 1. Pseudo-LiDAR Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving康奈尔大学https://zhuanlan.zhihu.com/p/52803631 首先利用DRON或PSMNET从单目 (Monocular)或双目 (Stereo)图像获取对应的…

设计院图纸加密防泄密方案——天锐绿盾加密软件@德人合科技

天锐绿盾是一款专业的企业信息化防泄密软件&#xff0c;主要针对文档全生命周期进行加密保护&#xff0c;包括创建、修改、传输、归档、分发、销毁等全过程。它可以加强外发数据及终端离线的管理&#xff0c;对正常授权外带范围内的数据流程进行规范。设计图纸、文档等成果数据…

(免费领源码)java#Springboot#mysql装修选购网站99192-计算机毕业设计项目选题推荐

摘 要 随着科学技术&#xff0c;计算机迅速的发展。在如今的社会中&#xff0c;市场上涌现出越来越多的新型的产品&#xff0c;人们有了不同种类的选择拥有产品的方式&#xff0c;而电子商务就是随着人们的需求和网络的发展涌动出的产物&#xff0c;电子商务网站是建立在企业与…

顺序表的定义与实现(数据结构与算法)

一、顺序表的定义 1. 顺序表的定义 #define MaxSize 10 //定义最大长度 typedef struct{ ElemType data[MaxSize]; //用静态的“数组”存放数据元素int length; //顺序表的当前长度 …

SparkSQL的Shuffle分区设定及异常数据处理API(去重、缺失值处理)

一、Spark SQL的Shuffle分区数目设定 二、异常数据处理API &#xff08;1&#xff09;去重方法dropDuplicates &#xff08;2&#xff09;删除有缺失值的行方法dropna &#xff08;3&#xff09;填充缺失值数据fillna 一、Spark SQL的Shuffle分区数目设定 在允许spark程序时&a…

Python实验项目4 :面对对象程序设计

1&#xff1a;运行下面的程序&#xff0c;回答问题。 &#xff08;1&#xff09;说明程序的执行过程&#xff1b; &#xff08;2&#xff09;程序运行结果是什么&#xff1f; # &#xff08;1&#xff09;说明程序的执行过程&#xff1b; # &#xff08;2&#xff09;程序运行…

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求&#xff0c;很多新手不晓得如何入手&#xff0c;难点在于通讯不中断。其实android发展到今天&#xff0c;很多技术都很完善&#xff0c;有很多类似框架可以实现。例如有&#xff1a;okhttp自带的websocket框架、easysocket等等。本文主…

如何做一个无符号数识别程序

1.状态分析 我们可以把无符号数分为&#xff1a;整数&#xff0c;带小数&#xff0c;带指数部分三种形式。以此构建一个DFA。首先需识别输入是整数还是小数点&#xff0c;若是整数部分输入然后还要再循环识别一次是否有小数点&#xff0c;最后识别是否有指数部分&#xff0c;指…

Spring学习笔记—JDK动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Redis -- 基础知识2

1.Redis客户端介绍 1.基础介绍 Redis是一种客户端-服务器结构的程序&#xff0c;通过网络进行互动 客户端的多种形态 1.自带了命令行客户端&#xff1a;redis-cil 2.图形化界面的客户端&#xff1a;依赖windows系统&#xff0c;连接服务器有诸多限制&#xff0c;不建议使用 3.基…