Golang 语言 Struct 中字段的 Tag 怎么使用?

开发 后端
在 Golang 语言中,我们可以使用反单引号为 Struct 中的字段设置 Tag,通过 Tag 可以为 Struct 中的字段定义附加属性。

 [[410625]]

01介绍

在 Golang 语言中,我们可以使用反单引号为 Struct 中的字段设置 Tag,通过 Tag 可以为 Struct 中的字段定义附加属性。Tag 实际上就是一个字符串,只不过有特定的格式,也就是说 Tag 字符串必须由 key:"value"组成,key 必须是非空字符串,value 必须由双引号引起来。

其中,每个 key 都是一个非空字符串,由除空格 (U+0020 ' ')、引号 (U+0022 '"') 和冒号 (U+003A ':') 以外的非控制字符组成;每个 value 都使用 U+0022 '"' 字符和 Go 字符串语法引用。

示例代码:

  1. type User struct { 
  2.     Id uint64 `json:"id"
  3.     Name string `json:"name"

02操作 Struct 字段中的 Tag

在 Golang 语言中,可以使用标准库 reflect 包操作 Struct 中的 Tag。在 reflect 包中,使用一个 StructField 表示 Struct 中的一个字段。

reflect 包源码:

  1. type StructField struct { 
  2.     Name string 
  3.     PkgPath string 
  4.     Type      Type      // field type 
  5.     Tag       StructTag // field tag string 
  6.     Offset    uintptr   // offset within struct, in bytes 
  7.     Index     []int     // index sequence for Type.FieldByIndex 
  8.     Anonymous bool      // is an embedded field 

阅读上面这段代码,可以看出 Tag 也是 Struct 中的一个字段的组成部分,Tag 的类型是 StructTag,实际上它是一个 string 类型的别名。

  1. type StructTag string 

StructTag 提供了 Get 方法 func (tag StructTag) Get(key string) string,可以通过给定参数 key 获取关联 value 的值。如果 Tag 中没有该 key,Get 返回空字符串。

示例代码:

  1. func GetTag () { 
  2.     u := User{} 
  3.     ut := reflect.TypeOf(u) 
  4.     for i := 0; i < ut.NumField(); i++ { 
  5.         fmt.Printf("字段:%s,标签:%s\n", ut.Field(i).Name, ut.Field(i).Tag.Get("json")) 
  6.     } 

其实,标准库 json 包转换 struct 为 JSON 字符串也是使用的类似的方法。

03总结

本文我们介绍了 Struct 字段中的 Tag 是什么,同时介绍了如何使用标准库 reflect 包操作 Struct 字段中的 Tag,实际上 Tag 只是一个字符串,reflect 包可以通过 Tag 作为参考条件,操作 Struct 字段。关于 reflect 包的更多介绍,感兴趣的读者可以翻阅之前的文章。

本文转载自微信公众号「Golang语言开发栈」,可以通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。

 

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2023-06-09 08:16:09

GolangStruct Tag

2021-09-13 05:02:49

GogRPC语言

2021-06-07 23:19:44

Golang语言 Defer

2021-08-02 07:57:02

Struct指针函数

2022-01-09 23:04:19

语言打印结构体

2021-01-29 08:56:13

Golang标准库函数

2021-06-09 23:36:46

Golang语言版本

2021-04-28 09:02:48

Golang语言Context

2023-03-06 08:01:25

structGo语言

2021-12-13 01:24:14

语言Golang panic

2021-06-29 23:40:19

Golang语言并发

2021-10-10 23:02:49

Golang语言代码

2022-01-04 23:13:57

语言PanicGolang

2021-11-08 23:09:07

Go排序数据

2021-07-26 11:19:43

微服务开发技术

2021-10-31 23:01:50

语言拼接字符串

2021-11-28 23:06:30

语言编程接口

2023-11-05 12:20:10

匿名函数Golang

2009-06-26 10:19:00

Clob字段Hibernate

2022-02-07 23:07:19

Golang语言Modules
点赞
收藏

51CTO技术栈公众号