- 开发无止境 -
Data: 2019-01-02 11:48:36Form: JournalClick: 12
Tag是结构体在编译阶段关联到成员的元信息字符串,在运行的时候通过反射的机制读取出来。
结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔的,如下
key会指定反射的解析方式,ps: json(JSON标签) orm(Beego标签)、gorm(GORM标签)、bson(MongoDB标签)、form(表单标签)、binding(表单验证标签) search(搜索标签)
包介绍 encoding/json
JSON 数组
可以用于编码Go语言的数组
和slice
;由于JSON对象
是一个字符串到值的映射,写成一系列的name:value
对形式,因此JSON的对象
类型可以用于编码Go语言的map
和结构体
。
将Go语言中结构体slice
转为JSON的过程叫编组
(marshaling),编组通过json.Marshal
函数完成。在编码时,默认使用Go语言结构体的成员名字作为JSON的对象(通过reflect反射技术)。只有导出的结构体成员才会被编码。
标签选项 | 使用说明 |
---|---|
- | 字段不进行序列化 例:json:"-" |
omitempy | 类型零值或空值,序列化时忽略该字段 例:json:",omitempy" 字段名省略的话用结构体字段名 |
type | 重新指定字段类型 例:json:"age,int" |
模型是标准的 struct,由基本数据类型以及实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成。
gorm.Model 结构体,如图:
gorm
为键名的标签遵循GORM的解析规则,GORM支持如下tag,tag名大小写不敏感
标签项 | 介绍 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
size | 指定列大小,ps:size:1024 |
primaryKey | 主键 |
unique | 指定为唯一 |
default | 默认值 |
precision | 精度 |
scale | 列大小 |
not null | NOT NULL |
autoIncrement | 自动增长,不可与primaryKey 、type 同时使用否则不生效 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌套字段前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:milli |
autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 ,查看 约束 获取详情 |
comment | 迁移时为字段添加注释 |
- | 忽略该字段,- 无读写权限 |
标签 | 描述 |
---|---|
foreignKey | 指定当前模型的列作为连接表的外键 |
references | 指定引用表的列名,其将被映射为连接表外键 |
polymorphic | 指定多态类型,比如模型名 |
polymorphicValue | 指定多态值、默认表名 |
many2many | 指定连接表表名 |
joinForeignKey | 指定连接表的外键列名,其将被映射到当前表 |
joinReferences | 指定连接表的外键列名,其将被映射到引用表 |
constraint | 关系约束,例如:OnUpdate 、OnDelete |
注:GORM模型 官方文档
Gin中提供了模型绑定,将表单数据和模型进行绑定,方便参数校验和使用。
通过 form:"email" 对表单email数据进行绑定。然后通过Bind()、ShouldBind()等方法获取参数值。 ps:
Gin对于数据的校验使用的是 validator.v10
包,该包提供多种数据校验方法,通过validate:""
标签来进行数据校验。
标签项 | 介绍 | 示例 |
---|---|---|
required | 必须的 | validate:"required" |
omitempty | 如果字段未设置,则忽略它 | validate:"omitempty" |
范围验证: 切片、数组和map、字符串,验证其长度;数值,验证大小范围
标签项 | 介绍 | 示例 |
---|---|---|
len | 参数值等于给定值 | validate:"len=1" 等于1 |
ne | 不等于 | validate:"ne=1" |
max | 最大值 | validate:"max=1" |
min | 最小值 | validate:"min=1" |
lte | 小于等于 | validate:"lte=1" |
gte | 大于等于 | validate:"gte=1" |
lt | 小于 | validate:"lt=1" |
gt | 大于 | validate:"gt=1" |
oneof | 参数值只能是枚举值中的一个,值必须是数值或字符串,以空格分隔,如果字符串中有空格,将字符串用单引号包围 | validate:"oneof=1 2 3 4" |
注:文档地址
标签项 | 介绍 | 示例 |
---|---|---|
contains | 包含 | validate:"contains=1" |
excludes | 不包含 | validate:"excludes=1" |
startswith | 以xx开始 | validate:"startswith=1" |
endswith | 以xx结束 | validate:"endswith=1" |
注:文档地址
标签项 | 介绍 |
---|---|
eqcsfield | 跨不同结构体字段相等,比如struct1 field1 是否等于struct2 field2 |
necsfield | 跨不同结构体字段不相等 |
eqfield | 同一结构体字段相等验证,例如:输入两次密码 |
nefield | 同一结构体字段不相等验证 |
gtefield | 大于等于同一结构体字段 |
ltefield | 小于等于同一结构体字段 |
标签项 | 介绍 | 示例 |
---|---|---|
ip | 合法IP地址校验 | validate:"ip" |
合法邮箱校验 | validate:"email" | |
url | 合法的URL | validate:"url" |
uri | 合法的URI | validate:"uri" |
uuid | uuid校验 | validate:"uuid" |
datetime | 合法时间格式值校验 | validate:"datetime" |
json | JSON数据验证 | validate:"json" |
numeric | 数值验证 | validate:"numeric" |
number | 整数验证 | validate:"number" |
alpha | uui字母字符串验证 | validate:"alpha" |
alphanum | 字母数字字符串验证 | validate:"alphanum" |
ascii | Ascii 字符验证 | validate:"ascii" |
注:文档地址