标签的定义
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
● 指定列的数据类型。推荐使用通用类型,如 bool
、int
、uint
、float
、string
、time
、bytes
。
● 可以使用数据库特定的数据类型,如 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
● 指定列为自动增长。
● 不可与 primaryKey
、type
同时使用,否则可能不生效。
go
`gorm:"autoIncrement"`
autoIncrementIncrement
● 自动步长,控制连续记录之间的间隔。
/通常与数据库特定的设置相关。
embedded
● 嵌套字段。
● 将一个结构体完全嵌入到另一个结构体中。
go
`gorm:"embedded"`
embeddedPrefix
● 为嵌入字段的列名前缀。
go
`gorm:"embeddedPrefix:author_"`
autoCreateTime
● 创建时追踪当前时间。
● 对于 int
字段,追踪秒级时间戳,可以使用 nano
或 milli
来追踪纳秒、毫秒时间戳。
go
`gorm:"autoCreateTime:nano"`
autoUpdateTime
● 创建/更新时追踪当前时间。
● 对于 int
字段,追踪秒级时间戳,可以使用 nano
或 milli
来追踪纳秒、毫秒时间戳。
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 |