今天小编给大家带来《在 Go 中通过字段符号查找标签》,以下内容主要包含等知识点,如果你正在学习或准备学习golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
问题内容
给定一个包含字段的结构,我想以符号方式查找特定字段的标记值(不提供字符串形式的字段名称)。
type MyStruct struct {
Foo string `tag:"val"`
}
entity := MyStruct{}
tagVal := getTag(&entity.Foo) // the function would return "val" for Foo field
我想实现一个 gettag 函数,该函数将返回给定字段的标记值。
解决方案
指向字段值的指针不包含有关所有者结构的任何信息,这是一种不同的间接方式,因此仅具有指针字段值不足以解决问题。
一种解决方案是使用指向所有者结构的指针以及指向该结构中字段的指针,通过反射迭代该结构值的字段,直到迭代字段的地址与给定的字段值指针匹配。
https://play.golang.org/p/kaPQ9HF9wAK
package main
import (
"fmt"
"reflect"
)
func main() {
type MyStruct struct {
Foo string `tag:"val"`
}
entity := MyStruct{}
tagVal := getTag(&entity, &entity.Foo)
fmt.Println(tagVal) // val
}
func getTag(structPtr, fieldPtr interface{}) string {
sf, ok := structFieldByValPtr(structPtr, fieldPtr)
if !ok {
return ""
}
return sf.Tag.Get("tag")
}
func structFieldByValPtr(structPtr, fieldPtr interface{}) (reflect.StructField, bool) {
v := reflect.Indirect(reflect.ValueOf(structPtr))
t := v.Type()
for i := 0; i < v.NumField(); i++ {
fv := v.Field(i)
ft := t.Field(i)
if fv.Addr().Interface() == fieldPtr {
return ft, true
}
if ft.Anonymous {
sf, ok := structFieldByValPtr(fv.Addr().Interface(), fieldPtr)
if ok {
return sf, true
}
}
}
return reflect.StructField{}, false
}
好了,本文到此结束,带大家了解了《在 Go 中通过字段符号查找标签》,希望本文对你有所帮助!