Golang 语言 Struct 中字段的 Tag 怎么使用?
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 stringStructTag 提供了 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语言开发栈公众号。