GO--结构体标签

标签的定义

Tag是结构体在编译阶段关联到成员的元信息字符串,在运行的时候通过反射的机制读取出来。

结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔,具体的格式如下:

JSON 复制代码
`key1:"value1" key2:"value2" key3:"value3"...`  // 键值对用空格分隔

key指定反射的解析方式,如下: json(JSON标签) 、orm(Beego标签)、gorm(GORM标签)、bson(MongoDB标签)、form(表单标签)、binding(表单验证标签)

JSON标签

JSON标签的定义

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于机器解析和生成。它基于JavaScript的一个子集,但JSON是独立于语言的文本格式,很多编程语言都支持JSON格式数据的生成和解析。

JSON标签选项

-:

  • 字段不进行序列化。如果结构体中有一个字段不希望它出现在JSON输出中,可以使用这个选项。
go 复制代码
type Example struct {
    SensitiveInfo string `json:"-"` // 这个字段在JSON编码和解码时会被忽略
}

omitempty:

  • 如果字段的值是该类型的零值(如0、false、"" 等),在序列化时忽略该字段。如果一个字段在某些情况下没有值,不希望这个字段出现在JSON输出中,可以使用这个选项。
go 复制代码
type Example struct {
    Name string `json:"name,omitempty"` // 如果Name为空字符串,序列化时"name"键会被忽略
}

type:

  • 重新指定字段类型。这个选项通常不单独使用,而是与其他选项结合使用。
  • 如果需要指定字段的类型,可以在标签中包含类型信息。
go 复制代码
type Example struct {
    Age int `json:"age,string"` // 将Age字段编码为JSON字符串而不是数字
}

注意事项

● 当使用 omitempty 时,如果字段的值是空值(如指针为 nil ,切片、映射、通道或接口为 nil ),该字段将不会被包含在JSON输出中。

● type选项通常用于当你需要改变字段的JSON编码类型时,例如将整数字段编码为字符串。

● JSON标签必须紧跟在字段声明的后面,并且用反引号 `` 包围,以确保它们被正确地识别为结构体的标签。

GORM标签

GORM标签的定义

GORM 标签是用于在 Go 语言的 GORM ORM 库中定义模型字段时的元数据。这些标签提供了一种方式来指定字段的数据库行为,例如如何映射到数据库表的列、设置字段的约束、定义索引、处理时间戳等;

gorm为键名的标签遵循GORM的解析规则,GORM支持如下tag,tag名大小写不敏感,建议使用camelCase风格,多个标签定义用分号(;)分隔

GORM标签选项

column

● 指定数据库列名。

go 复制代码
`gorm:"column:username"`

type

● 指定列的数据类型。推荐使用通用类型,如 boolintuintfloatstringtimebytes

● 可以使用数据库特定的数据类型,如 varbinary(8),需要完整的数据库数据类型定义。

go 复制代码
gorm:"type:varchar(255)"`

size

● 定义列的数据类型大小或长度。

go 复制代码
`gorm:"size:256"`

primaryKey

● 将列定义为主键。

go 复制代码
`gorm:"primaryKey"`

unique

● 将列定义为唯一键。

go 复制代码
`gorm:"unique"`

default

● 指定列的默认值。

● 字符串默认值需要使用单引号。

go 复制代码
`gorm:"default:'cn'"`

precision

● 指定列的精度。

go 复制代码
`gorm:"precision:10"`

scale

● 指定列的标度(小数点后的位数)。

go 复制代码
`gorm:"scale:2"`

not null

● 指定列为 NOT NULL。

go 复制代码
`gorm:"not null"`

autoIncrement

● 指定列为自动增长。

● 不可与 primaryKeytype 同时使用,否则可能不生效。

go 复制代码
`gorm:"autoIncrement"`

autoIncrementIncrement

● 自动步长,控制连续记录之间的间隔。

/通常与数据库特定的设置相关。

embedded

● 嵌套字段。

● 将一个结构体完全嵌入到另一个结构体中。

go 复制代码
`gorm:"embedded"`

embeddedPrefix

● 为嵌入字段的列名前缀。

go 复制代码
`gorm:"embeddedPrefix:author_"`

autoCreateTime

● 创建时追踪当前时间。

● 对于 int 字段,追踪秒级时间戳,可以使用 nanomilli 来追踪纳秒、毫秒时间戳。

go 复制代码
`gorm:"autoCreateTime:nano"`

autoUpdateTime

● 创建/更新时追踪当前时间。

● 对于 int 字段,追踪秒级时间戳,可以使用 nanomilli 来追踪纳秒、毫秒时间戳。

go 复制代码
`gorm:"autoUpdateTime:milli"`

index

● 根据参数创建索引。多个字段使用相同的名称则创建复合索引。

go 复制代码
`gorm:"index"`

uniqueIndex

● 创建唯一索引。

● 与 index 相同,但创建的是唯一索引。

go 复制代码
`gorm:"uniqueIndex"`

check

● 创建检查约束。

go 复制代码
`gorm:"check:age > 13"`

<-

● 设置字段写入的权限。

<-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限。

->

● 设置字段读的权限。

->:false 无读权限。

-

● 忽略该字段。

- 无读写权限。

comment

● 迁移时为字段添加注释。

● 通常用于数据库迁移时添加字段的描述信息。

go 复制代码
`gorm:"comment:'用户名'"`

自动更新时间

  • GORM约定使用CreatedAt、UpdatedAt追踪创建/更新时间。
  • 如果定义了这种字段,且默认值为零值,GORM在创建、更新时会自动填充当前时间。
  • 要使用不同名称的字段,可以配置autoCreateTime、autoUpdateTime标签;
  • 如果想要保存 UNIX(毫/纳)秒时间戳,而不是 time,只需简单地将 time.Time 修改为 int 即可。

关联标签

标签选项 使用说明
foreignKey 指定当前模型的列作为连接表的外键 例:gorm:"foreignKey:FieldId" 其中FieldID是外键字段名
references 指定引用表的列名,其将被映射为连接表外键
polymorphic 指定多态类型,比如模型名polymorphicValue指定多态值、默认表名
many2many 指定连接表表名
joinForeignKey 指定连接表的外键列名,其将被映射到当前表
joinReferences 指定连接表的外键列名,其将被映射到引用表
constraint 关系约束,例如:OnUpdate、OnDelete
相关推荐
David爱编程几秒前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术18 分钟前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术36 分钟前
Spring AI存储向量数据
后端
苏三的开发日记36 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记38 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
陈三一42 分钟前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure43 分钟前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜1 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee
文火冰糖的硅基工坊1 小时前
[激光原理与应用-317]:光学设计 - Solidworks - 草图
开发语言·python·信息可视化·系统架构