项目场景:
通过反射获取结构体得tag标签
问题描述:
在获取tag标签时, panic: reflect: FieldByName of non-struct type
获取tag代码:
type testsa struct {
Testc string `json:"testc"`
Testb string `json:"testb"`
Testn int `json:"testn"`
Testp *float64 `json:"testp" react:"f-s"`
Tests *uint64 `json:"testp" react:"u-s"`
}
func main() {
var c = uint64(1235342)
var b = float64(247923472)
var tetname = &testsa{
Testc: "2",
Testb: "1",
Testn: 3123,
Testp: &b,
Tests: &c,
}
listname := GetFieldName(tetname)
for _, v := range listname {
typeOfCat := reflect.TypeOf(tetname)
//占位符
if catType, ok := typeOfCat.FieldByName(v); ok { //这里是报错行
// 从tag中取出需要的tag
fmt.Println(catType.Tag.Get("json"), catType.Tag.Get("react"))
}
}
}
原因分析:
在项目中使用得类型都是指针,反射的时候需要值,而不是指针
解决方案:
判断一下,如果反射结构体后,反射对象是指针类型,将代码改为下面
修改后代码:
type testsa struct {
Testc string `json:"testc"`
Testb string `json:"testb"`
Testn int `json:"testn"`
Testp *float64 `json:"testp" react:"f-s"`
Tests *uint64 `json:"testp" react:"u-s"`
}
func main() {
var c = uint64(1235342)
var b = float64(247923472)
var tetname = &testsa{
Testc: "2",
Testb: "1",
Testn: 3123,
Testp: &b,
Tests: &c,
}
listname := GetFieldName(tetname)
for _, v := range listname {
typeOfCat := reflect.TypeOf(tetname)
//修改开始
if typeOfCat.Kind() == reflect.Ptr {
typeOfCat = typeOfCat.Elem()
}
//修改结束
if catType, ok := typeOfCat.FieldByName(v); ok { //这里是报错行
// 从tag中取出需要的tag
fmt.Println(catType.Tag.Get("json"), catType.Tag.Get("react"))
}
}
}