0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Go中给GORM模型添加枚举类型

马哥Linux运维 来源:稀土掘金技术社区 2023-11-28 15:36 次阅读

GORM中的枚举介绍

GORM是一个流行的Go ORM,它允许我们定义结构体来表示数据库表,并提供一个接口来执行CRUD操作。枚举在编程中是一个有用的特性,它允许我们定义一个变量可以取的固定值集。在这篇文章中,我们将探索如何向GORM模型添加枚举。

第一步:定义枚举

首先,我们需要定义枚举值的类型。在Go中,我们可以用string类型来定义枚举。如下:


type Status string


const (
    Pending Status = "pending"
    Approved Status = "approved"
    Rejected Status = "rejected"
)

在该示例中,我们定义了枚举类型Status,该类型有3个枚举值:"pending","approved", "rejectd"。

第二步:定义模型

其次,我们需要定义一个gorm模型来使用该枚举类型。如下:


type User struct {
    ID        uint   `gorm:"primary_key"`
    Name      string
    Status    Status
    CreatedAt time.Time
    UpdatedAt time.Time
}

在该示例中,User模型中有一个枚举类型Status的字段。

第三步:在gorm操作中使用枚举

在定义了枚举类型和gorm模型后,我们就可以在gorm的操作中使用枚举类型了。如下:


user := User{Name: "John", Status: Pending}
db.Create(&user)




var users []User
db.Where("status = ?", Approved).Find(&users)




db.Model(&user).Update("status", Rejected)




db.Where("status = ?", Pending).Delete(User{})

在上面的示例中,我们在gorm的创建、查询、更新和删除操作中都使用到了Status的枚举类型。

那么,我们看看在go中有哪些常见的定义枚举的方法。

方法一:使用字符串类型

在模型中,我们可以是通过使用字符串类型来替代枚举类型。如下:


type User struct {
  ID   uint
  Role string
}

在该示例中,我们可以使用Role这个字符串类型来表示不同的用户角色,比如“admin”,“moderator”以及“user”等等。

但这种方式也有缺点,比如容易出现拼写错误,没有类型的约束。

方法二:自定义类型

另外一种替代枚举类型的方法是通过自定义类型来代表枚举值。如下:


type Role string


const (
  Admin     Role = "admin"
  Moderator Role = "moderator"
  User      Role = "user"
)


type User struct {
  ID   uint
  Role Role
}

在这个示例中,Role类型被定义成了字符串的别名。然后,不同的角色值以常量的形式定义。最后,在User模型中的Role字段中使用了Role类型。

这种方法的优点是可以做编译时检查,因此不容易出现拼写错误。同时,该种方法还将值限制在了Role类型下。

方法三:使用GORM提供的枚举类进

Gorm提供了内建的枚举类型。如下:


type Role string


const (
  Admin     Role = "admin"
  Moderator Role = "moderator"
  User      Role = "user"
)


type User struct {
  ID   uint
  Role Role `gorm:"type:enum('admin', 'moderator', 'user')"`
}

在该示例中,Role类型被定义成string类型的别名成为一个新的类型,同时Role的值通过常量定义。在User的模型中,又通过gorm的标签来限制了该字段值的范围。

这种方法和方法二中的方式具有相同的优点,同时该方法还能让通过gorm创建数据表时,让数据表的字段也是enum类型的优点。

结论

在本文中,我们探讨了如何在Go中给GORM模型添加枚举类型。枚举是一个有用的功能,它允许我们定义变量可以取的一组固定值。通过在GORM模型中使用枚举,我们可以提高代码的类型安全性,使数据库操作更加可靠。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92406
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47692
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4521

原文标题:gorm中如何使用枚举值

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在SlaveFifoSync例程添加HID设备枚举

    devices and video and video devices at the same time?的内容,添加了HID相关的描述符,添加了hid设备的端口配置和DMA通道配置以及hid的线程。但是
    发表于 02-28 06:31

    何在multisim添加仿真模型

    最近小弟在学习multisim软件,用的版本是10.0,但是在仿真时找不到常用的元件,比如901*系列的三极管、8050等,请问如何添加这些模型
    发表于 10-16 10:08

    labview小白求教枚举类型控件

    学习labview还才3天,看的书是《labview宝典》,现在正好看到78页,关于“获取日期/时间字符串”函数,其中说到日期格式是枚举类型,但是我实际测试,枚举控件插入了三个项,值
    发表于 12-20 21:01

    详细讲解c语言enum枚举类型

    详细讲解C语言enum枚举类型在实际应用,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举
    发表于 12-21 23:22

    枚举类型最后面增加项报错

    各位大神:我的枚举类型RadioState,在最后面增加一项,之后程序很多用到RadioState的地方报错,这个是什么原因造成的?下图是我没有改之前的枚举
    发表于 05-15 12:02

    枚举enum的使用

    }SysError_TypeDef;//创建一个枚举变量就可以这样SysError_TypeDefSysError;个人比较喜欢第三种方式。另外就是在使用过程,遇到这样一个情况。要列举出系统错误类型。可以用这是
    发表于 02-06 15:09

    何在Allegro添加模型

    allegro这个怎么样添加模型
    发表于 08-01 05:35

    在Allegro软件添加xnet的具体步骤

    点击需要设置Xnet模型的元器件,右侧对应列表中会同步进行选中,也可以将同一类型的全部选中,如图5-114所示;    Xnet是什么含义,如何在Allegro软件
    发表于 09-07 17:57

    一个函数返回的类型枚举,能不能将此状态赋值一个char呢?

    一个函数返回的类型枚举类型,现在我在另外的一个子程序调用了这个函数,能不能将此函数的返回状态赋值一个unsigned char
    发表于 11-10 06:11

    枚举是C语言中的一种基本数据类型

    在C语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。不过在一
    的头像 发表于 09-25 15:45 8352次阅读
    <b class='flag-5'>枚举</b>是C语言中的一种基本数据<b class='flag-5'>类型</b>

    go语言枚举类型怎么用

    如 c、 java 等,都有原生支持。在 go 中,大家却找不到 enum 或者其它直接用来声明枚举类型的关键字。从熟悉其它编程语言的开发者转用 go 编程,刚开始会比较难接受这种情况
    的头像 发表于 09-02 09:43 4884次阅读

    SystemVerilog中枚举类型的使用建议

    SystemVerilog中枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一
    的头像 发表于 09-01 14:20 1135次阅读

    浅析SystemVerilog中的枚举类型

    枚举类型定义了一组具有名称的值,在没有指定值时默认是int型数值。
    的头像 发表于 10-13 09:44 999次阅读

    枚举类型的简单扩展学习

    定义枚举类型的值只能是整型常量,正数、负数和零都可以,但不可以是浮点数
    的头像 发表于 05-25 15:45 455次阅读

    Java枚举的特点及用法

    在 Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又好在哪里呢。 本文将分析一下
    的头像 发表于 09-30 10:02 427次阅读