Go语言反射解析结构体

Go语言反射解析结构体教程

Golang 中,通过 反射 除了可以解析 结构体 的字段信息,还可以解析结构体字段的 Tag 的具体信息,我们可以根据 Tag 名,获取 Tag 的具体描述。

Go语言解析结构体Tag

StructTag 拥有一些方法,可以进行 Tag 信息的解析和提取,如下所示:

方法 说明
func(tag StructTag)Get(key string)string 根据 Tag 中的键获取对应的值,例如 key1:"value1"key2:"value2" 的 Tag 中,可以传入“key1”获得“value1”
func(tag StructTag)Lookup(key string)(value string,ok bool) 根据 Tag 中的键,查询值是否存在。

Go语言解析结构体Tag

语法

personType := reflect.TypeOf(person) fieldName, isOk := personType.FieldByName("Name") jsobTagVal := fieldName.Tag.Get("json")

说明

首先,使用 reflect.TypeOf 获取类实例的信息,接着,使用 FieldByName 获取字段名的详细信息,最后,使用字段的详细信息的 Tag.Get 获取 Tag 信息。

案例

Go语言反射解析结构体Tag

通过反射解析结构体字段的 Tag 信息

package main import ( "fmt" "reflect" ) type Person struct { Name string `json:"name" bson:"Name"` Age int `json:"age" bson:"Age"` } func main() { fmt.Println("嗨客网(www.haicoder.net)") person := Person{ Name:"HaiCoder", Age:109, } personType := reflect.TypeOf(person) fieldName, isOk := personType.FieldByName("Name") if isOk{ jsonTag := fieldName.Tag.Get("json") bsonTag := fieldName.Tag.Get("bson") fmt.Println("Name Json Tag =", jsonTag, "Bson Tag =", bsonTag) }else{ fmt.Println("No Name Field") } fieldAge, isOk := personType.FieldByName("Age") if isOk{ jsonTag := fieldAge.Tag.Get("json") bsonTag := fieldAge.Tag.Get("bson") fmt.Println("Name Json Tag =", jsonTag, "Bson Tag =", bsonTag) }else{ fmt.Println("No Age Field") } }

程序运行后,控制台输出如下:

24_golang反射获取结构体字段.png

首先,我们定义了一个 Person 结构体,结构体含有两个字段,一个 字符串 类型的 Name 和一个 int 类型的 Age。

其中,Name 字段有两个 Tag,一个是名为 json 的 Tag,一个是名为 bson 的 Tag。Age 字段也是有一个名为 json 的 Tag和一个名为 bson 的 Tag。

接着,我们使用 reflect.TypeOf 获取结构体的实例,并使用实例信息的 FieldByName 获取字段的详细信息,再使用 Tag.Get 方法传入 Tag 名,获取 Tag 的信息。

Go语言反射解析结构体Tag总结

在 Golang 中,通过反射除了可以解析结构体的字段信息,还可以解析结构体字段的 Tag 的具体信息,我们可以根据 Tag 名,获取 Tag 的具体描述。Go 语言解析结构体 Tag 语法:

personType := reflect.TypeOf(person) fieldName, isOk := personType.FieldByName("Name") jsobTagVal := fieldName.Tag.Get("json")