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}]