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 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语言开发栈公众号。

高防服务器
滇ICP备2023000592号-31