go创建完美的枚举类型

news2025/1/12 0:55:35

文章目录

    • 一.前言
    • 二. 枚举基本要素描述
    • 三. 枚举设计源码
      • 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.coloradmin.cn/o/1137539.html

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

相关文章

【RocketMQ】揭开事务消息的神秘面纱

【RocketMQ】揭开事务消息的神秘面纱 参考资料&#xff1a; 解析 RocketMQ 业务消息——“事务消息”—— 阿里云 RocketMQ事务消息, 图文、源码学习探究~ RocketMQ实战一&#xff1a;事务消息保证分布式事务的一致性 RocketMQ源码分析13&#xff1a;事务消息 《RocketMQ技术内…

Miniconda、Vscode下载和conda源、pip源设置

1、常用软件下载 1、Miniconda软件下载&#xff1a; windows网址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CS&OA 2、最新版Miniconda下载网址&#xff1a;https://docs.conda.io/projects/miniconda/en/latest/ 3、常用代码编辑器VsCode下…

haproxy 负载均衡

haproxy负载均衡 haproxy&#xff1a;基于C语言开发的开源软件 支持高性能的tcp和http负载均衡器&#xff0c;工作中用的版本1.5.9 haproxy功能&#xff1a;主要用于高并发的web站点&#xff0c;工作原理和nginx、lvs都一样 haproxy缺点: 单节点部署&#xff0c;单实例运行。代…

3DCAT+东风日产:共建线上个性化订车实时云渲染方案

近年来&#xff0c;随着5G网络和云计算技术的不断发展&#xff0c;交互式3D实时云看车正在成为一种新的看车方式。 与传统的到4S店实地考察不同&#xff0c;消费者可以足不出户&#xff0c;通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性…

ToLua使用原生C#List和Dictionary

ToLua是使用原生C#List 介绍Lua中使用原生ListC#调用luaLua中操作打印测试如下 Lua中使用原生DictionaryC#调用luaLua中操作打印测试如下 介绍 当你用ToLua时C#和Lua之间肯定是会互相调用的&#xff0c;那么lua里面使用List和Dictionary肯定是必然的&#xff0c;在C#中可以调用…

基本分段存储管理方式

与分页区别-离散分配时分配地址空间的基本单位不同 一、概述 1.分段 将进程地址空间按程序自身逻辑关系划分为若干个段&#xff0c;每个段都有段名&#xff0c;且从0开始编址 逻辑地址段号(段名)段内地址(段内偏移量) 程序中的段名会被翻译成对应段号&#xff0c;段内单元…

ASPICE项目实战

目录 一、前言 二、ASPICE是什么 三、ASPICE项目实施 一、前言 ASPICE全称“AutomotiveSoftware ProcessImprovement and CapacityDetermination”&#xff0c;即汽车软件过程改进及能力评定为什么要做ASPICE&#xff1f;满足主机厂为OEM资质要求&#xff1b;改善产品研发质…

iOS开发-自定义下拉刷新控件PullDownRefreshView

iOS开发-自定义下拉刷新控件PullDownRefreshView 在开发过程中&#xff0c;有时候需要自定义下拉刷新控件&#xff0c;这时候我们就需要自定义PullDownRefreshView。 PullDownRefreshView是在UIScrollView上。 一、UIScrollView 在下拉刷新过程中&#xff0c;需要实现UISc…

天锐绿盾企业内网安全管理软件

天锐绿盾&#xff0c;又名绿盾信息安全管理软件是一款企业内网安全管理软件&#xff0c;它将局域网内文件的透明加密、内网的有效管理有效地结合起来&#xff0c;功能强大&#xff0c;能满足不同类型企业用户对信息安全的需求。 试用下载&#xff1a;www.drhchina.com 主要功能…

深度学习与计算机视觉(一)

文章目录 计算机视觉与图像处理的区别人工神经元感知机 - 分类任务Sigmoid神经元/对数几率回归对数损失/交叉熵损失函数梯度下降法- 极小化对数损失函数线性神经元/线性回归均方差损失函数-线性回归常用损失函数使用梯度下降法训练线性回归模型线性分类器多分类器的决策面 soft…

2016年亚太杯APMCM数学建模大赛A题基于光学信息数据的温度及关键元素含量预测求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 A题 基于光学信息数据的温度及关键元素含量预测 原题再现 光含有能量&#xff0c;在一定条件下可以转化为热。燃烧是一种常见的现象&#xff0c;既能发光又能发热。光和热通常是同时存在的&#xff0c;一般来说&#xff0c;光强度越高&#xf…

一招教会跨国企业如何解决跨境数据传输的丢包和延迟问题

跨境数据传输是跨国企业的重要需求&#xff0c;无论是进行远程协作、视频会议、在线教育、电子商务、游戏娱乐等业务&#xff0c;都需要实时地在不同国家和地区之间传输数据。然而&#xff0c;跨境数据传输也面临着很多挑战&#xff0c;如网络延迟、丢包、不稳定等&#xff0c;…

I/O软件层次结构(用户层软件,设备独立性软件,设备驱动程序,中断处理程序,硬件)

文章目录 1.用户层软件2.设备独立性软件1.主要实现的功能2.逻辑设备表&#xff08;LUT&#xff09; 3.设备驱动程序4.中断处理程序2.中断处理程序的处理流程 4.硬件 1.用户层软件 用户层软件实现了与用户交互的接口&#xff0c;用户可直接使用该层提供的、与I/O操作相关的库函数…

Go 语言代码断行规则详解

一、Go代码断行概念 代码断行&#xff0c;或称为代码换行&#xff0c;是编程中一个很常见但却经常被忽视的细节。它涉及到如何在代码行结束时添加换行符&#xff0c;使代码展示为多行结构。代码断行不仅影响代码的可读性和美观性&#xff0c;还可能与编程语言的语法、编译器行…

Framework -- 系统架构

一、前言 framework的学习&#xff0c;需要掌握到什么程度&#xff1f; App 的启动流程&#xff1a;整体的过程&#xff0c;具体到某些类在整个流程中所起的作用&#xff1b;组件的设计模式&#xff0c;核心设计思想&#xff1b;需要知晓目前已知的问题&#xff0c;以及解决方…

定档11月2日,YashanDB 2023年度发布会完整议程公布

数据库作为支撑核心业务的关键技术&#xff0c;对数字经济的发展有着重要的支撑作用&#xff0c;随着云计算、AI等技术的迅猛发展和数据量的爆发式增长&#xff0c;推动着数据库技术的加速创新。 为了应对用户日益复杂的数据管理需求&#xff0c;赋能行业国产化建设和数字化转型…

python 线程池/AIO(异步非阻塞)调用接口示例

分别测试了 多线程、线程池、aio 等模式 线程受CPU调度限制&#xff0c;大请求量下 AIO 效率最高&#xff0c;详见代码 注释中有详细说明&#xff0c;main 方法中是程序入口 """ python 各种方式发起 http 请求对比 参考&#xff1a; https://plainenglish.io…

“第五十一天”

无符号整数&#xff1a; 计算机硬件在进行无符号整数的加法时&#xff0c;从最低位开始&#xff0c;按位相加&#xff0c;并往更高位进位。 当进行减法时&#xff0c;被减数不变&#xff0c;减数全部按位取反&#xff0c;末位加一&#xff08;将一个正数变负&#xff0c;或者…

关键词搜索淘宝商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)

关键词搜索淘宝商品数据接口是可以通过API的方式来进行调用。这些接口可以获取到商品列表的标题、SKU ID、价格、优惠价、收藏数、月销售量等数据。 通过这些接口&#xff0c;可以实现关键词搜索淘宝商品列表的功能&#xff0c;也可以获取到商品详情页的数据信息&#xff0c;适…