GORM 自定义数据类型-枚举 (今天仓促,明天修改)

2023-12-08 00:28

本文主要是介绍GORM 自定义数据类型-枚举 (今天仓促,明天修改),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 枚举
    • 枚举的终极办法,原文3.0版本
      • 枚举的实现举例

学习来源: 枫枫知道

枚举

  很多时候,由于字符串的所占据空间较大,而某些状态的值是一定的,所以我们希望用枚举来固定对应的值。这样不仅可以节省空间,更关键的是可以方便后期的维护
  我们这里以主机管理为例,状态有 Running 运行中, OffLine 离线, Except 异常
  我们跳过原文章中方法逐步优化的过程,直接到最完善的版本,即使用数字表示状态和使用类型别名的方法,最后通过手动逻辑方法来实现golang中的枚举

枚举的终极办法,原文3.0版本

package mainimport ("encoding/json""fmt"
)type Status int // 类型别名// 定义running、except、offline对应的常量,本质为整数数据
// 通过定义常量我们可以在查询时直接返回这里的常量名,而不是数字等容产生歧义
const ( //在线、异常、离线Running Status = iota + 1 // iota为golang中常量的行索引,起步为0,每行+1ExceptOffline
)type Host struct {ID     uint   `gorm:"json:id"`Name   string `gorm:"json:name"`Status Status `gorm:"json:status"`
}// 在status的json序列化过程中进行常量和字符串的转化
func (status Status) MarshalJSON() ([]byte, error) {var str string //定义一个字符串方便对status的json转换switch status {case Running:str = "running"case Except:str = "except"case Offline:str = "offline"}return json.Marshal(str)}func main() {//定义一个host主机实例var host = Host{Status: Running,Name:   "wang2",}result, _ := json.Marshal(host) //序列化host为json以存储fmt.Printf(string(result))//查询结果如下,可以看到status的值这里查询为字符//{"ID":0,"Name":"wang2","Status":"running"}
}

枚举的实现举例

package mainimport ("encoding/json""fmt""time"
)type WeekDay int //定义一个数值的类型别名,方便显示var WeekStringList = []string{"Sunday", "Monday", "Tuesday", "Thursday", "Wednesday", "Friday", "Saturday"}
var WeekTypeList = []WeekDay{Sunday, Monday, Tuesday, Thursday, Wednesday, Friday, Saturday}func (WeekDay WeekDay) String() string {s := WeekStringList[WeekDay-1]fmt.Println(s)return s
}func (WeekDay WeekDay) MarshalJSON() ([]byte, error) {s, _ := json.Marshal(WeekDay.String())return s, nil
}// 超级落后
const (Sunday WeekDay = iota + 1MondayTuesdayWednesdayThursdayFridaySaturday
)/*func (WeekDay WeekDay) MarshalJSON() ([]byte, error) {var str stringswitch WeekDay {case Sunday:str = "Sunday"case Monday:str = "Monday"case Tuesday:str = "Tuesday"case Thursday:str = "Thursday"case Wednesday:str = "Wednesday"case Friday:str = "Friday"case Saturday:str = "Saturday"}return json.Marshal(str)}
*/type DayInfo struct {WeekDay WeekDay   `json:"WeekDay"`Data    time.Time `json:"Data"`
}func main() {December7th := DayInfo{WeekDay: Wednesday,Data:    time.Now(),}re, _ := json.Marshal(December7th)fmt.Printf(string(re))
}

这篇关于GORM 自定义数据类型-枚举 (今天仓促,明天修改)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467846

相关文章

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提