从 Go 结构中提取标签作为 reflect.Value
Extract tags from Go struct as a reflect.Value
我正在尝试从作为结构的特定值中提取标签。我能够获取结构的字段但无法提取标签。我在这里做错了什么?我尝试了很多不同的方法(使用 reflect.Type、interface{} 等)但都失败了。
type House struct {
Room string
Humans Human
}
type Human struct {
Name string `anonymize:"true"` // Unable to get this tag
Body string
Tail string `anonymize:"true"` // Unable to get this tag
}
func printStructTags(f reflect.Value) { // f is of struct type `human`
for i := 0; i < f.NumField(); i++ {
fmt.Printf("Tags are %s\n", reflect.TypeOf(f).Field(i).Tag) // TAGS AREN'T PRINTED
}
}
我使用reflect.Value
作为参数的原因是因为这个函数是通过以下方式从另一个函数调用的
var payload interface{}
payload = &House{}
// Setup complete
v := reflect.ValueOf(payload).Elem()
for j := 0; j < v.NumField(); j++ { // Go through all fields of payload
f := v.Field(j)
if f.Kind().String() == "struct" {
printStructTags(f)
}
}
任何见解都将非常有价值
当您调用 reflect.TypeOf(f)
时,您会得到 f
的类型,它已经是 reflect.Value
。
使用此 f
的 Type()
函数获取类型并对其进行字段检查:
func printStructTags(f reflect.Value) { // f is of struct type `human`
for i := 0; i < f.NumField(); i++ {
fmt.Printf("Tags are %s\n", f.Type().Field(i).Tag)
}
}
但是,使用 f.Type().Field(i).Tag.Get("anonymize")
可以更轻松地检查标签并获取其值。这样您就可以直接获得分配的值,例如 true
在您的情况下,如果标签不存在则为空字符串。
我正在尝试从作为结构的特定值中提取标签。我能够获取结构的字段但无法提取标签。我在这里做错了什么?我尝试了很多不同的方法(使用 reflect.Type、interface{} 等)但都失败了。
type House struct {
Room string
Humans Human
}
type Human struct {
Name string `anonymize:"true"` // Unable to get this tag
Body string
Tail string `anonymize:"true"` // Unable to get this tag
}
func printStructTags(f reflect.Value) { // f is of struct type `human`
for i := 0; i < f.NumField(); i++ {
fmt.Printf("Tags are %s\n", reflect.TypeOf(f).Field(i).Tag) // TAGS AREN'T PRINTED
}
}
我使用reflect.Value
作为参数的原因是因为这个函数是通过以下方式从另一个函数调用的
var payload interface{}
payload = &House{}
// Setup complete
v := reflect.ValueOf(payload).Elem()
for j := 0; j < v.NumField(); j++ { // Go through all fields of payload
f := v.Field(j)
if f.Kind().String() == "struct" {
printStructTags(f)
}
}
任何见解都将非常有价值
当您调用 reflect.TypeOf(f)
时,您会得到 f
的类型,它已经是 reflect.Value
。
使用此 f
的 Type()
函数获取类型并对其进行字段检查:
func printStructTags(f reflect.Value) { // f is of struct type `human`
for i := 0; i < f.NumField(); i++ {
fmt.Printf("Tags are %s\n", f.Type().Field(i).Tag)
}
}
但是,使用 f.Type().Field(i).Tag.Get("anonymize")
可以更轻松地检查标签并获取其值。这样您就可以直接获得分配的值,例如 true
在您的情况下,如果标签不存在则为空字符串。