Go 标签使用详解

2,513 阅读3分钟

0. Go的标签

Go标签在结构体中使用,在结构体编译阶段,可以通过反射被获取。

Go标签是用``符号引起来的一组key-value键值对,需要注意的是,value需要被“”括起来,另外,键值对之间要以空格间隔,如下格式:

struet demo {
    demo int `k1:"v1" k2:"v2"`
}

在Go中,标签有着方便json字符串以及常用框架解析的重要作用,下面,我们分门别类的梳理一下常用的标签,方便大家理解。

1. JSON标签

JSON字符串是我们常用的数据传输格式,由一组k-v键值对组成,很多时候,我们需要将接收到的JSON串与我们规定好的数据结构体绑定,方便直接调用,JSON标签能很便捷的完成这一工作,这些标签能被encoding/json包中的编码与解码工具解析。

Tag作用
"json_name"将结构体的属性与json_name的对应(可以省略,与属性同名,且会在名字后面加 s)
"-"说明结构体的该属性不参与序列化
"json_name,omitempy"如果为类型零值或空值,序列化时忽略该字段
"json_name,string[number|boolen]"指定属性的类型,支持string、number、boolen
type Student struct { 
    ID int `json:"-"` // 该字段不进行序列化 
    Class int `json:"class"` // 该字段与class对应
    Name string `json:"name,omitempy"` // 如果为类型零值或空值,序列化时忽略该字段 
    Age int `json:"age,string"` // 指定类型,支持string、number、boolen 
}

2. Gorm标签

Gorm框架负责ORM层与数据库表之间的映射,他的标签也是更加方便我们完成这一工作。

Gorm标签下的子标签大小写不敏感,子标签之间使用;分割,常用的单表Tag如下:

Tag作用
"column"将结构体的属性与column的列对应,建议使用column_name的格式命名
"type"数据库中列的类型
"primaryKey"指定列为主键
"default"指定列为默认值

常用的多表关联Tag如下:

Tag作用
foreignKey指定当前模型的列作为连接表的外键 例:gorm:"foreignKey:FieldId" 其中FieldID是外键字段名
references指定引用表的列名,其将被映射为连接表外键,例如"foreignKey:FieldId;references:FieldIdOther"
polymorphic指定多态类型,比如模型名
polymorphicValue指定多态值、默认表名
many2many指定连接表表名
joinForeignKey指定连接表的外键列名,其将被映射到当前表
joinReferences指定连接表的外键列名,其将被映射到引用表
constraint关系约束,例如:OnUpdateOnDelete

3. Gin标签

Gin框架中的标签主要完成请求数据中携带的参数到数据模型的映射。

Tag作用
form:"nameParam"制定当前属性值与请求报文中的nameParam对应
binding:"verify"指定当前属性值通过"verify"的方式进行验证,Gin提供了一些默认的方式,我们也可以自己定义验证函数。