前言
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 |