介绍
在 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"` }
操作 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 包的更多介绍,感兴趣的读者可以翻阅之前的文章。
推荐阅读:
参考资料:
https://golang.org/pkg/reflect/#StructField
https://golang.org/pkg/reflect/#StructTag