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
相关推荐
啦啦右一15 分钟前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien16 分钟前
Spring Boot常用注解
java·spring boot·后端
轻口味43 分钟前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans2 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#