golang 反射报错 panic: reflect: FieldByName of non-struct type

项目场景:

通过反射获取结构体得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"))
		}
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值