当前位置: 首页 > article >正文

GO--结构体标签

标签的定义

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

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

`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输出中,可以使用这个选项。
type Example struct {
    SensitiveInfo string `json:"-"` // 这个字段在JSON编码和解码时会被忽略
}

omitempty:

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

type:

  • 重新指定字段类型。这个选项通常不单独使用,而是与其他选项结合使用。
  • 如果需要指定字段的类型,可以在标签中包含类型信息。
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

● 指定数据库列名。

`gorm:"column:username"`

type

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

gorm:"type:varchar(255)"`

size

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

`gorm:"size:256"`

primaryKey

● 将列定义为主键。

`gorm:"primaryKey"`

unique

● 将列定义为唯一键。

`gorm:"unique"`

default

● 指定列的默认值。
● 字符串默认值需要使用单引号。

`gorm:"default:'cn'"`

precision

● 指定列的精度。

`gorm:"precision:10"`

scale

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

`gorm:"scale:2"`

not null

● 指定列为 NOT NULL。

`gorm:"not null"`

autoIncrement

● 指定列为自动增长。
● 不可与 primaryKeytype 同时使用,否则可能不生效。

`gorm:"autoIncrement"`

autoIncrementIncrement

● 自动步长,控制连续记录之间的间隔。
/通常与数据库特定的设置相关。

embedded

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

`gorm:"embedded"`

embeddedPrefix

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

`gorm:"embeddedPrefix:author_"`

autoCreateTime

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

`gorm:"autoCreateTime:nano"`

autoUpdateTime

● 创建/更新时追踪当前时间。
● 对于 int 字段,追踪秒级时间戳,可以使用 nanomilli 来追踪纳秒、毫秒时间戳。

`gorm:"autoUpdateTime:milli"`

index

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

`gorm:"index"`

uniqueIndex

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

`gorm:"uniqueIndex"`

check

● 创建检查约束。

`gorm:"check:age > 13"`

<-

● 设置字段写入的权限。
<-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限。

->

● 设置字段读的权限。
->:false 无读权限。

-

● 忽略该字段。
- 无读写权限。

comment

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

`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

http://www.kler.cn/news/353556.html

相关文章:

  • 三个线程交替打印ABC
  • Java读取PDF后做知识库问答_SpringAI实现
  • Vue基础(3)
  • 区块链积分系统:重塑支付安全与商业创新的未来
  • Java知识巩固(五)
  • visio导出pdf公式变形问题杂谈
  • 如何在 cPanel 中使用 PHP-FPM
  • 推荐一个可以免费上传PDF产品图册的网站
  • 【鸟类识别系统】Python+卷积神经网络算法+人工智能+深度学习+ResNet50算法+计算机课设项目
  • 缓存区是什么
  • Vue3 使用CryptoJS加密
  • 介绍 TensorFlow 的基本概念和使用场景(AI)
  • 关于拖拽时需要注意的细节
  • 多层感知机 MLP
  • 【优选算法篇】编织算法的流动诗篇:滑动窗口的轻盈之美
  • Golang | Leetcode Golang题解之第477题汉明距离总和
  • mqtt客户端订阅一直重复连接?
  • 详解SSH和bash
  • 【Linux】嵌入式Linux系统的组成、u-boot编译
  • 灵当CRM data/pdf.php 任意文件读取漏洞复现