在 Golang 中,通过 反射 除了可以解析 结构体 的字段信息,还可以解析结构体字段的 Tag 的具体信息,我们可以根据 Tag 名,获取 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 中的键,查询值是否存在。 |
personType := reflect.TypeOf(person)
fieldName, isOk := personType.FieldByName("Name")
jsobTagVal := fieldName.Tag.Get("json")
首先,使用 reflect.TypeOf 获取类实例的信息,接着,使用 FieldByName 获取字段名的详细信息,最后,使用字段的详细信息的 Tag.Get 获取 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")
}
}
程序运行后,控制台输出如下:
首先,我们定义了一个 Person 结构体,结构体含有两个字段,一个 字符串 类型的 Name 和一个 int 类型的 Age。
其中,Name 字段有两个 Tag,一个是名为 json 的 Tag,一个是名为 bson 的 Tag。Age 字段也是有一个名为 json 的 Tag和一个名为 bson 的 Tag。
接着,我们使用 reflect.TypeOf
获取结构体的实例,并使用实例信息的 FieldByName 获取字段的详细信息,再使用 Tag.Get 方法传入 Tag 名,获取 Tag 的信息。
在 Golang 中,通过反射除了可以解析结构体的字段信息,还可以解析结构体字段的 Tag 的具体信息,我们可以根据 Tag 名,获取 Tag 的具体描述。Go 语言解析结构体 Tag 语法:
personType := reflect.TypeOf(person)
fieldName, isOk := personType.FieldByName("Name")
jsobTagVal := fieldName.Tag.Get("json")