news 2026/4/18 10:12:52

GORM 结构体字段标签(Struct Tags)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GORM 结构体字段标签(Struct Tags)详解

一、GORM 模型字段标签基础语法

GORM 使用 struct tag 定义字段行为:

type User struct { FieldName DataType `gorm:"tag1:value1;tag2:value2" json:"field_name"` }

优先级(从高到低):

  1. gorm:"..."主控制标签(数据库行为)

  2. 其他标签(json、form 等)

  3. 结构体字段名作为默认列名(SnakeCase)


二、字段标签分类与详解(最重要部分)

1. 基本字段标签

(1) column(指定数据库列名)

gorm:"column:user_name"

(2) type(指定数据库字段类型)

gorm:"type:varchar(100)"

(3) primaryKey(主键)

gorm:"primaryKey"

(4) autoIncrement(自增)

与 primaryKey 组合常用。

gorm:"primaryKey;autoIncrement"

(5) unique / uniqueIndex(唯一约束)

gorm:"unique" // 单字段唯一 gorm:"uniqueIndex" // 创建唯一索引 gorm:"uniqueIndex:idx_name" // 复合唯一索引

(6) index(普通索引)

gorm:"index" // 单字段索引 gorm:"index:idx_name" // 指定索引名 gorm:"index:idx_name,priority:1" // 复合索引顺序

(7) size(字符串长度)

gorm:"size:255"

(8) default(默认值)

gorm:"default:0" gorm:"default:'unknown'"

(9) not null(非空)

gorm:"not null"

(10) <- / ->(字段读写权限)

控制 GORM 是否对该字段进行写入或读取:

gorm:"<-:create" // 仅创建时写入 gorm:"<-:update" // 仅更新时写入 gorm:"<-:false" // 禁止写入 gorm:"->:false" // 查询不读该字段 gorm:"-:" // 读写都禁用 gorm:"-" // 完全忽略该字段

2. 时间相关标签(CreateAt/UpdatedAt)

(1) autoCreateTime(创建自动填充)

gorm:"autoCreateTime" gorm:"autoCreateTime:milli" // 毫秒 gorm:"autoCreateTime:nano" // 纳秒

(2) autoUpdateTime(更新自动填充)

gorm:"autoUpdateTime" gorm:"autoUpdateTime:milli" gorm:"autoUpdateTime:nano"

3. 外键 / 关联关系标签

(1) foreignKey(外键字段)

gorm:"foreignKey:UserID"

(2) references(指定关联的字段)

gorm:"references:ID"

(3) constraint(外键约束)

gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"

(4) many2many(多对多中间表)

gorm:"many2many:user_roles"

(5) polymorphic(多态关联)

gorm:"polymorphic:Owner"

4. Serializer(序列化字段)

适用于 JSON、MsgPack 等类型存储。

(1) 保存为 JSON

gorm:"serializer:json"

示例:

type User struct { Hobbies []string `gorm:"serializer:json"` }

5. Embedded / EmbeddedPrefix(嵌入字段)

(1) embedded(字段嵌入,不创建嵌套)

gorm:"embedded"

(2) embeddedPrefix(嵌入字段添加前缀)

gorm:"embeddedPrefix:user_"

6. comment(字段注释)

gorm:"comment:'用户年龄'"

三、字段标签使用示例(非常完整)

下面是一个实际业务级别的模型,涵盖各种标签。

type User struct { ID uint `gorm:"primaryKey;autoIncrement;comment:'主键ID'"` UserName string `gorm:"column:user_name;type:varchar(50);uniqueIndex;not null;comment:'用户名'"` Email string `gorm:"type:varchar(100);index:idx_email;not null;comment:'邮箱地址'"` Age int `gorm:"default:0;comment:'年龄'"` Profile UserProfile `gorm:"embedded;embeddedPrefix:profile_"` Tags []string `gorm:"serializer:json;comment:'标签(JSON)'"` CreatedAt time.Time `gorm:"autoCreateTime"` UpdatedAt time.Time `gorm:"autoUpdateTime"` DeletedAt gorm.DeletedAt `gorm:"index"` } type UserProfile struct { Address string `gorm:"type:varchar(200)"` Avatar string `gorm:"type:varchar(255)"` }

四、关联模型完整示例

1. 一对多(User 有多个 Orders)

type User struct { ID uint Orders []Order `gorm:"foreignKey:UserID"` } type Order struct { ID uint UserID uint }

2. 多对多(Users 共享 Roles)

type User struct { ID uint Roles []Role `gorm:"many2many:user_roles"` } type Role struct { ID uint Name string }

五、GORM 中 Tag 的常见坑和注意事项

1. default 只在建表时生效,不影响运行时零值

如果字段是 0 或 "",GORM 不会主动应用 default。

解决方法:

Age *int `gorm:"default:18"`

2. 字段必须导出(首字母大写)GORM 才能识别

3. 没有not null时,GORM 不会自动加默认非空

4. JSON serializer 必须使用 slice 或 map,不支持 struct 直接存储 unless implement Scanner/Valuer

5. uniqueIndex 必须在 AutoMigrate 后才能生效


六、总结表:最常用的 GORM Tag 清单

标签作用
column指定列名
type指定数据库类型
primaryKey主键
autoIncrement自增
unique / uniqueIndex唯一约束
index索引
size字符串长度
default默认值
not null非空
<-写属性
->读属性
-忽略字段
autoCreateTime创建时间
autoUpdateTime更新时间
foreignKey外键字段
references外键关联字段
many2many多对多
serializer:jsonJSON 存储
embedded内嵌字段
embeddedPrefix内嵌字段前缀
comment字段注释
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 9:10:25

设计转换工具的终极指南:如何实现从设计到动画的无缝工作流

设计转换工具的终极指南&#xff1a;如何实现从设计到动画的无缝工作流 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 在当今快节奏的创意产业中&#xff0c;设计转换工具已成为提升工…

作者头像 李华
网站建设 2026/4/18 6:24:35

Maputnik 开源地图样式编辑器快速入门指南

Maputnik 开源地图样式编辑器快速入门指南 【免费下载链接】maputnik An open source visual editor for the MapLibre Style Specification 项目地址: https://gitcode.com/gh_mirrors/ma/maputnik Maputnik 是一个针对 MapLibre GL 样式规范的开源视觉编辑器&#xff…

作者头像 李华
网站建设 2026/4/17 13:32:17

CMATH终极指南:如何用AI模型通过小学数学考试?[特殊字符]

CMATH终极指南&#xff1a;如何用AI模型通过小学数学考试&#xff1f;&#x1f680; 【免费下载链接】cmath CMATH: Can your language model pass Chinese elementary school math test? 项目地址: https://gitcode.com/gh_mirrors/cm/cmath 想要知道当前最火的大语言…

作者头像 李华
网站建设 2026/4/18 7:52:38

React Router原型开发:1小时打造可演示的SPA框架

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速生成一个具备完整路由功能的React单页应用原型。要求&#xff1a;1. 3-5个主要页面 2. 导航菜单 3. 页面间过渡效果 4. URL参数处理 5. 基本的404处理。代码要足够精简但功能完…

作者头像 李华
网站建设 2026/4/15 15:49:41

MinIO零基础入门:10分钟搭建个人云盘

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个极简的MinIO入门教学应用&#xff0c;包含&#xff1a;1. 分步式的Docker安装向导&#xff08;带错误检测&#xff09;2. 可视化MinIO控制台汉化版 3. 傻瓜式文件上传下载演…

作者头像 李华
网站建设 2026/4/17 16:23:54

3步搞定macOS远程存储连接:iSCSI Initiator完全指南

3步搞定macOS远程存储连接&#xff1a;iSCSI Initiator完全指南 【免费下载链接】iSCSIInitiator iSCSI Initiator for macOS 项目地址: https://gitcode.com/gh_mirrors/is/iSCSIInitiator 在当今数据驱动的时代&#xff0c;Mac用户经常面临存储空间不足的困扰。macOS …

作者头像 李华