01介绍
在 Golang 语言中,我们可以使用反单引号为 Struct 中的字段设置 Tag,通过 Tag 可以为 Struct 中的字段定义附加属性。Tag 实际上就是一个字符串,只不过有特定的格式,也就是说 Tag 字符串必须由 key:"value"组成,key 必须是非空字符串,value 必须由双引号引起来。
其中,每个 key 都是一个非空字符串,由除空格 (U+0020 ' ')、引号 (U+0022 '"') 和冒号 (U+003A ':') 以外的非控制字符组成;每个 value 都使用 U+0022 '"' 字符和 Go 字符串语法引用。
示例代码:
- type User struct {
- Id uint64 `json:"id"`
- Name string `json:"name"`
- }
02操作 Struct 字段中的 Tag
在 Golang 语言中,可以使用标准库 reflect 包操作 Struct 中的 Tag。在 reflect 包中,使用一个 StructField 表示 Struct 中的一个字段。
reflect 包源码:
- type StructField struct {
- Name string
- PkgPath string
- Type Type // field type
- Tag StructTag // field tag string
- Offset uintptr // offset within struct, in bytes
- Index []int // index sequence for Type.FieldByIndex
- Anonymous bool // is an embedded field
- }
阅读上面这段代码,可以看出 Tag 也是 Struct 中的一个字段的组成部分,Tag 的类型是 StructTag,实际上它是一个 string 类型的别名。
- type StructTag string
StructTag 提供了 Get 方法 func (tag StructTag) Get(key string) string,可以通过给定参数 key 获取关联 value 的值。如果 Tag 中没有该 key,Get 返回空字符串。
示例代码:
- func GetTag () {
- u := User{}
- ut := reflect.TypeOf(u)
- for i := 0; i < ut.NumField(); i++ {
- fmt.Printf("字段:%s,标签:%s\n", ut.Field(i).Name, ut.Field(i).Tag.Get("json"))
- }
- }
其实,标准库 json 包转换 struct 为 JSON 字符串也是使用的类似的方法。
03总结
本文我们介绍了 Struct 字段中的 Tag 是什么,同时介绍了如何使用标准库 reflect 包操作 Struct 字段中的 Tag,实际上 Tag 只是一个字符串,reflect 包可以通过 Tag 作为参考条件,操作 Struct 字段。关于 reflect 包的更多介绍,感兴趣的读者可以翻阅之前的文章。
本文转载自微信公众号「Golang语言开发栈」,可以通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。