golang 获取循环嵌套结构的tag

golang 获取

type Parent struct {
	Age  int    `json:"age"`
	City string `json:"city" cond:"title:城市"`
	Name string `json:"name" cond:"title:name1"`
}

type Son struct {
	Parent
	Name string `json:"name" cond:"title:名字"`
}

需要对Son{} 进行获取循环嵌套的cond的结构的数据结果。

  • 没有 cond 的忽略
  • 继承的依旧优先级低

方法实现

package main

import (
	"errors"
	"fmt"
	"reflect"
)

func GetAllTags(rt reflect.Type, key string) (tags map[string]reflect.StructField, err error) {
	tags = make(map[string]reflect.StructField)
	if rt.Kind() != reflect.Struct {
		err = errors.New(fmt.Sprintf("bad type not struct %s", rt.Kind()))
		return
	}

	for i := 0; i < rt.NumField(); i++ {
		f := rt.Field(i)

		// 嵌套型
		if f.Type.Kind() == reflect.Struct {
			var newTags map[string]reflect.StructField
			newTags, err = GetAllTags(f.Type, key)
			if err != nil {
				return
			}

			for k, v := range newTags {
				tags[k] = v
			}
		}

		tag := f.Tag.Get(key)
		if tag == "" {
			continue
		}
		jsonName := f.Tag.Get("json")
		if jsonName == "" {
			err = errors.New(fmt.Sprintf("error %s missing tag JSON", f.Name))
			return
		}
		tags[jsonName] = f
	}

	return
}

type Parent struct {
	Age  int    `json:"age"`
	City string `json:"city" cond:"title:城市"`
	Name string `json:"name" cond:"title:name1"`
}

type Son struct {
	Parent
	Name string `json:"name" cond:"title:名字"`
}

func main() {
	var (
		err  error
		key  = "cond"
		alls map[string]reflect.StructField
	)
	{
		alls, err = GetAllTags(reflect.TypeOf(Son{}), key)
		if err != nil {
			fmt.Println("err1 = ", err.Error())
		} else {
			fmt.Println("alls = ", alls)
		}
	}
}

// outputs:
// alls =  map[city:{City  string json:"city" cond:"title:城市" 8 [1] false} name:{Name  string json:"name" cond:"title:名字" 40 [1] false}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值