前言
Go 语言中Struct声明包含三部分: field_name, field_type, field_tag.
field_tag的作用:
可以作为字段后额外的注释或者说明
在反射场景下,
reflect包中提供了操作tag的方法,tag的写法需要遵循一定规则.
使用
Tag 书写规则
tag是一串字符串, 以空格分隔的key:"value"对.
key: 为非空字符串, 字符串不含控制字符\空格\引号\冒号.value: 以双引号标记的字符串.- 以
:分隔,并且冒号前后不能有空格.
| |
reflect获取Tag值
StructTag提供了Get(key string) string方法来获取Tag,示例如下:
| |
程序输出如下:
| |
Tag的作用
使用反射可以动态的给结构体成员赋值,正是因为有tag,在赋值前可以使用tag来决定赋值的动作。 比如,官方的encoding/json包,可以将一个JSON数据Unmarshal进一个结构体,此过程中就使用了Tag. 该包定义一些规则,只要参考该规则设置tag就可以将不同的JSON数据转换成结构体。
总之:正是基于struct的tag特性,才有了诸如json数据解析、orm映射等等的应用。理解这个关系是至关重要的。或许,你可以定义另一种tag规则,来处理你特有的数据。
Tag使用举例
| 包 | 包中关于tag的规则 | full example |
|---|---|---|
| json | https://godoc.org/encoding/json#Marshal | “my_name,omitempty” 声明名字+可省略 ",omitempty" 值为空则省略此字段 “my_name” 在json中此字段的键 "-" 字段始终省略 |
| default | https://github.com/creasty/defaults#usage | |
| gorm | https://godoc.org/github.com/jinzhu/gorm | https://www.cnblogs.com/zisefeizhu/p/12788017.html#%E7%BB%93%E6%9E%84%E4%BD%93%E6%A0%87%E8%AE%B0tags |
| yaml | https://godoc.org/gopkg.in/yaml.v2 | |
| xml | https://godoc.org/encoding/xml |