1 Star 0 Fork 0

tomatomeatman / GolangRepository

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
ReflectUtil.go 22.91 KB
一键复制 编辑 原始数据 按行查看 历史
laowei 提交于 2024-02-27 17:34 . 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
package system
import (
"reflect"
"strings"
)
type ReflectUtils struct{}
// 取结构体各属性的tag信息
func (ru ReflectUtils) GetTagInfo(entry interface{}) map[string]reflect.StructTag {
result := make(map[string]reflect.StructTag)
s := reflect.TypeOf(entry).Elem() //通过反射获取type定义
for i := 0; i < s.NumField(); i++ {
if s.Field(i).Anonymous {
temp := getAnonyTagInfo(s.Field(i))
if nil == temp {
continue
}
for key := range temp {
result[key] = temp[key]
}
continue
}
tag := s.Field(i).Tag
result[s.Field(i).Name] = tag
}
return result
}
// 取结构体匿名属性的tag信息
func getAnonyTagInfo(sf reflect.StructField) map[string]reflect.StructTag {
if !sf.Anonymous {
return nil
}
result := make(map[string]reflect.StructTag)
t := sf.Type
for k := 0; k < t.NumField(); k++ {
if t.Field(k).Anonymous {
temp := getAnonyTagInfo(t.Field(k))
if nil == temp {
continue
}
for key := range temp {
result[key] = temp[key]
}
continue
}
tag := t.Field(k).Tag
result[t.Field(k).Name] = tag
}
return result
}
// 取结构体指定属性的tag信息
func (ru ReflectUtils) GetTagInfoByName(entry interface{}, name string) reflect.StructTag {
if name == "" {
return ""
}
elem := reflect.TypeOf(entry).Elem() //通过反射获取type定义
if sf, ok := elem.FieldByName(name); ok {
return sf.Tag
}
for i := 0; i < elem.NumField(); i++ {
if !elem.Field(i).Anonymous {
continue
}
temp := ru.getAnonyTagInfoByName(elem.Field(i), name)
if temp != "" {
return temp
}
}
return ""
}
// 取结构体匿名属性中指定名称的tag信息
func (ru ReflectUtils) getAnonyTagInfoByName(sf reflect.StructField, name string) reflect.StructTag {
if !sf.Anonymous {
return ""
}
t := sf.Type
for k := 0; k < t.NumField(); k++ {
if name == t.Field(k).Name {
return t.Field(k).Tag
}
}
for k := 0; k < t.NumField(); k++ {
if !t.Field(k).Anonymous {
continue
}
if t.Field(k).Anonymous {
temp := ru.getAnonyTagInfoByName(t.Field(k), name)
if "" == temp {
continue
}
return temp
}
}
return ""
}
// 取实体对应父类实体(对应数据库)
func (ru ReflectUtils) GetBaseEntity(entity interface{}) interface{} {
var rte reflect.Type
var rve reflect.Value
typeOf := reflect.TypeOf(entity) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(entity).Elem()
rte = rve.Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if entity.(reflect.Value).Kind() == reflect.Ptr {
rve = entity.(reflect.Value).Elem()
} else if entity.(reflect.Value).Kind() == reflect.Struct {
rve = entity.(reflect.Value)
} else {
rve = entity.(reflect.Value)
}
rte = rve.Type()
} else {
rve = reflect.ValueOf(entity)
rte = rve.Type()
}
for k := 0; k < rte.NumField(); k++ {
field := rte.Field(k)
if field.Anonymous && strings.HasSuffix(field.Name, "Base") { //必须是匿名及'Base'结尾
return rve.Field(k) //找到
}
}
return entity //没找到
}
//-----------------------------------------------------------//
/**
* 利用反射设置属性值
* @param object 被修改属性的对象
* @param name 属性名
* @param val 值 不确定类型
* @return
*/
func (ru ReflectUtils) SetFieldValue(object interface{}, name string, val interface{}) {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
field := rve.FieldByName(name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
c := name[0]
if (!strings.HasPrefix(name, "G")) && ('a' <= c) && (c <= 'z') {
field := rve.FieldByName("G" + name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
}
}
/**
* 利用反射设置属性值
* @param object 被修改属性的对象
* @param name 属性名
* @param val 值 字符串
* @return
*/
func (ru ReflectUtils) SetFieldString(object interface{}, name string, val string) {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
field := rve.FieldByName(name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
c := name[0]
if (!strings.HasPrefix(name, "G")) && ('a' <= c && c <= 'z') {
field := rve.FieldByName("G" + name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
}
}
/**
* 利用反射设置属性值
* @param object 被修改属性的对象
* @param name 属性名
* @param val 值 字符串
* @return
*/
func (ru ReflectUtils) SetFieldInt(object interface{}, name string, val int) {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
field := rve.FieldByName(name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
c := name[0]
if (!strings.HasPrefix(name, "G")) && ('a' <= c && c <= 'z') {
field := rve.FieldByName("G" + name)
if field.IsValid() {
field.Set(reflect.ValueOf(val))
return
}
}
}
/**
* 利用反射取实际类型名称
* @param object 被修改属性的对象
* @return
*/
func (ru ReflectUtils) GetTypeName(object interface{}) string {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
return rve.Type().Name()
}
/**
* 利用反射取属性值
* @param object 被修改属性的对象
* @param name 属性名
* @return
*/
func (ru ReflectUtils) GetFieldValue(object interface{}, name string) interface{} {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
field := rve.FieldByName(name)
if !field.IsValid() {
return nil
}
return field.Interface()
}
/**
* 利用反射执行函数
* @param object 被修改属性的对象
* @param name 属性名
* @return
*/
func (ru ReflectUtils) DoMethod(object interface{}, name string, paramList ...interface{}) []reflect.Value {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
// } else if typeOf.Kind() == reflect.Struct {
// rve = typeOf
} else {
rve = reflect.ValueOf(object)
}
method := rve.MethodByName(name)
if !method.IsValid() {
return []reflect.Value{}
}
if nil == paramList {
params := make([]reflect.Value, 0)
return method.Call(params)
}
params := make([]reflect.Value, len(paramList))
for i := 0; i < len(paramList); i++ {
params[i] = reflect.ValueOf(paramList[i])
}
return method.Call(params)
}
/**
* 判断函数是否存在
* object 待检查对象
* name 函数名
*/
func (ru ReflectUtils) HasMethod(object interface{}, name string) bool {
var rve reflect.Type
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem().Type()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value).Type()
} else {
rve = object.(reflect.Value).Type()
}
} else {
rve = reflect.ValueOf(object).Type()
}
_, has := rve.MethodByName(name)
return has
// var rve reflect.Value
// typeOf := reflect.TypeOf(object) //通过反射获取type定义
// if typeOf.Kind() == reflect.Ptr { //是否指针类型
// rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
// } else if "reflect.Value" == typeOf.String() {
// rve = object.(reflect.Value)
// } else {
// rve = reflect.ValueOf(object)
// }
// method := rve.MethodByName(name)
// if !method.IsValid() {
// return false
// }
// return true
}
/**
* 取函数
* object 待检查对象
* name 函数名
*/
func (ru ReflectUtils) GetMethod(object interface{}, name string) reflect.Value {
var rve reflect.Value
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value)
} else {
rve = object.(reflect.Value)
}
} else {
rve = reflect.ValueOf(object)
}
method := rve.MethodByName(name)
if !method.IsValid() {
return reflect.Value{}
}
return method
}
/**
* 判断字段是否存在
* object 待检查对象
* name 成员名
* fieldPrefix 字段前缀(可不传)
*/
func (ru ReflectUtils) HasField(object interface{}, name string, fieldPrefix ...string) bool {
var rve reflect.Type
typeOf := reflect.TypeOf(object) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(object).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if object.(reflect.Value).Kind() == reflect.Ptr {
rve = object.(reflect.Value).Elem().Type()
} else if object.(reflect.Value).Kind() == reflect.Struct {
rve = object.(reflect.Value).Type()
} else {
rve = object.(reflect.Value).Type()
}
} else {
rve = reflect.ValueOf(object).Type()
}
prefix := ""
for _, key := range fieldPrefix {
prefix = prefix + key
}
_, has := rve.FieldByName(prefix + name)
return has
//typeOf := reflect.TypeOf(object) //通过反射获取type定义
//if typeOf.Kind() == reflect.Ptr { //是否指针类型
// typeOf = typeOf.Elem()
//}
//_, has := typeOf.FieldByName(name)
//return has
}
/**
* 按实体保留map中的数据
* object 待检查对象
* data 数据
* fieldPrefix 字段前缀(可不传)
*/
func (ru ReflectUtils) HoldByEntity(entity interface{}, data map[string]interface{}, fieldPrefix ...string) map[string]interface{} {
var rve reflect.Type
typeOf := reflect.TypeOf(entity) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(entity).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if entity.(reflect.Value).Kind() == reflect.Ptr {
rve = entity.(reflect.Value).Elem().Type()
} else if entity.(reflect.Value).Kind() == reflect.Struct {
rve = entity.(reflect.Value).Type()
} else {
rve = entity.(reflect.Value).Type()
}
} else if typeOf.Kind() == reflect.Struct {
rve = typeOf
} else {
rve = reflect.ValueOf(entity).Type()
}
result := map[string]interface{}{}
for _, prefix := range fieldPrefix {
for key, value := range data {
str := key
if "" != prefix {
str = prefix + key
}
_, b := rve.FieldByName(str)
if b {
result[key] = value
}
}
}
// prefix := ""
// for _, key := range fieldPrefix {
// prefix = prefix + key
// }
// for key, _ := range data {
// //--先检查没有前缀的情况下是否存在
// _, b := rve.FieldByName(key)
// if !b {
// delete(data, key)
// }
// str := key
// if "" != prefix {
// str = prefix + key
// }
// _, b = rve.FieldByName(str)
// if !b {
// delete(data, key)
// }
// }
return result
//typeOf := reflect.TypeOf(entity) //通过反射获取type定义
//if typeOf.Kind() == reflect.Ptr { //是否指针类型
// typeOf = typeOf.Elem()
//}
//prefix := ""
//for _, key := range fieldPrefix {
// prefix = prefix + key
//}
//for key, _ := range data {
// str := key
// if "" != prefix {
// str = prefix + key
// }
// _, b := typeOf.FieldByName(str)
// if !b {
// delete(data, key)
// }
//}
//return data
}
/**
* 按实体剔除map中的数据
* object 待检查对象
* data 数据
* fieldPrefix 字段前缀(可不传)
*/
func (ru ReflectUtils) RemoveByEntity(entity interface{}, data map[string]interface{}, fieldPrefix ...string) map[string]interface{} {
var rve reflect.Type
typeOf := reflect.TypeOf(entity) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(entity).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if entity.(reflect.Value).Kind() == reflect.Ptr {
rve = entity.(reflect.Value).Elem().Type()
} else if entity.(reflect.Value).Kind() == reflect.Struct {
rve = entity.(reflect.Value).Type()
} else {
rve = entity.(reflect.Value).Type()
}
} else if typeOf.Kind() == reflect.Struct {
rve = typeOf
} else {
rve = reflect.ValueOf(entity).Type()
}
prefix := ""
for _, key := range fieldPrefix {
prefix = prefix + key
}
for key, _ := range data {
str := key
if "" != prefix {
str = prefix + key
}
_, b := rve.FieldByName(str)
if !b {
delete(data, key)
}
}
return data
//typeOf := reflect.TypeOf(entity) //通过反射获取type定义
//if typeOf.Kind() == reflect.Ptr { //是否指针类型
// typeOf = typeOf.Elem()
//}
//prefix := ""
//for _, key := range fieldPrefix {
// prefix = prefix + key
//}
//for key, _ := range data {
// str := key
// if "" != prefix {
// str = prefix + key
// }
// _, b := typeOf.FieldByName(str)
// if b {
// delete(data, key)
// }
//}
//return data
}
/**
* 按实体保留切片中的数据
* object 待检查对象
* data 数据
* fieldPrefix 字段前缀(可不传)
*/
func (ru ReflectUtils) HoldByEntityToArray(entity interface{}, data []string, fieldPrefix ...string) []string {
var rve reflect.Type
typeOf := reflect.TypeOf(entity) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(entity).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if entity.(reflect.Value).Kind() == reflect.Ptr {
rve = entity.(reflect.Value).Elem().Type()
} else if entity.(reflect.Value).Kind() == reflect.Struct {
rve = entity.(reflect.Value).Type()
} else {
rve = entity.(reflect.Value).Type()
}
} else if typeOf.Kind() == reflect.Struct {
rve = typeOf
} else {
rve = reflect.ValueOf(entity).Type()
}
result := []string{}
for _, prefix := range fieldPrefix {
for i := len(data) - 1; i >= 0; i-- {
key := data[i]
str := key
if "" != prefix {
str = prefix + key
}
_, b := rve.FieldByName(str)
if b {
result = append(data[:len(data)-1])
}
}
}
return result
//typeOf := reflect.TypeOf(entity) //通过反射获取type定义
//if typeOf.Kind() == reflect.Ptr { //是否指针类型
// typeOf = typeOf.Elem()
//}
//prefix := ""
//for _, key := range fieldPrefix {
// prefix = prefix + key
//}
//for i := len(data) - 1; i >= 0; i-- {
// key := data[i]
// str := key
// if "" != prefix {
// str = prefix + key
// }
// _, b := typeOf.FieldByName(str)
// if !b {
// data = append(data[:len(data)-1])
// }
//}
//return data
}
/**
* 按实体剔除切片中的数据
* object 待检查对象
* data 数据
* fieldPrefix 字段前缀(可不传)
*/
func (ru ReflectUtils) RemoveByEntityToArray(entity interface{}, data []string, fieldPrefix ...string) []string {
var rve reflect.Type
typeOf := reflect.TypeOf(entity) //通过反射获取type定义
if typeOf.Kind() == reflect.Ptr { //是否指针类型
rve = reflect.ValueOf(entity).Elem().Type() // 取得struct变量的指针
} else if "reflect.Value" == typeOf.String() {
if entity.(reflect.Value).Kind() == reflect.Ptr {
rve = entity.(reflect.Value).Elem().Type()
} else if entity.(reflect.Value).Kind() == reflect.Struct {
rve = entity.(reflect.Value).Type()
} else {
rve = entity.(reflect.Value).Type()
}
} else if typeOf.Kind() == reflect.Struct {
rve = typeOf
} else {
rve = reflect.ValueOf(entity).Type()
}
prefix := ""
for _, key := range fieldPrefix {
prefix = prefix + key
}
for i := len(data) - 1; i >= 0; i-- {
key := data[i]
str := key
if "" != prefix {
str = prefix + key
}
_, b := rve.FieldByName(str)
if b {
data = append(data[:len(data)-1])
}
}
return data
//typeOf := reflect.TypeOf(entity) //通过反射获取type定义
//if typeOf.Kind() == reflect.Ptr { //是否指针类型
// typeOf = typeOf.Elem()
//}
//prefix := ""
//for _, key := range fieldPrefix {
// prefix = prefix + key
//}
//for i := len(data) - 1; i >= 0; i-- {
// key := data[i]
// str := key
// if "" != prefix {
// str = prefix + key
// }
// _, b := typeOf.FieldByName(str)
// if b {
// data = append(data[:len(data)-1])
// }
//}
//return data
}
/**
* 动态创建数组
* entity 结构参照
*/
func (ru ReflectUtils) MakArray(entity interface{}) interface{} {
if nil == entity {
return nil
}
rt := reflect.TypeOf(entity)
sliceType := reflect.SliceOf(rt)
valueSlice := reflect.MakeSlice(sliceType, 0, 0)
return valueSlice.Interface()
}
/**
* 动态创建数组
* keyEntity 键结构参照
* valEntity 值结构参照
*/
func (ru ReflectUtils) MakMap(keyEntity interface{}, valEntity interface{}) interface{} {
if (nil == keyEntity) || (nil == valEntity) {
return nil
}
kType := reflect.TypeOf(keyEntity)
vType := reflect.TypeOf(valEntity)
mapType := reflect.MapOf(kType, vType)
mapValue := reflect.MakeMap(mapType)
return mapValue.Interface()
}
/**
* 数组转指定结构数组
* data 待转换数据,结构: []map[string]interface{}
* entity 结构参照,结构: []entity
*/
func (ru ReflectUtils) ToEntity(data []interface{}, entity interface{}) (interface{}, bool) {
if nil == entity {
return data, false
}
rt := reflect.TypeOf(entity)
sliceType := reflect.SliceOf(rt)
result := reflect.MakeSlice(sliceType, 0, 0)
for _, val := range data {
obj := reflect.New(rt).Elem()
for k, v := range val.(map[string]interface{}) {
field := obj.FieldByName(k)
if field.IsValid() {
field.Set(reflect.ValueOf(v))
continue
}
field = obj.FieldByName("G" + k)
if field.IsValid() {
field.Set(reflect.ValueOf(v))
}
}
result = reflect.Append(result, obj)
}
return result.Interface(), true
}
/**
* 通用Map转指定结构Map
* data 待转换Map,结构:
* entity 结构参照
*/
func (ru ReflectUtils) ToEntityMap(data map[string]interface{}, entity interface{}, tt reflect.Type) (interface{}, bool) {
if nil == entity {
return data, false
}
kType := reflect.TypeOf("")
vType := reflect.TypeOf(entity)
mapType := reflect.MapOf(kType, vType)
result := reflect.MakeMap(mapType)
num := vType.NumField()
for key, val := range data {
obj := reflect.New(vType).Elem()
vv := reflect.ValueOf(val)
for i := 0; i < num; i++ {
field := obj.FieldByName(reflect.TypeOf(val).Name())
if field.IsValid() {
field.Set(vv.Field(i))
continue
}
field = obj.FieldByName("G" + reflect.TypeOf(val).Name())
if field.IsValid() {
field.Set(vv.Field(i))
}
}
result.SetMapIndex(reflect.ValueOf(key), obj)
}
return result.Interface(), true
}
// 根据类型创建新的实体(指针或值)
// isReturnVal 是否以值返回,调用方为匿名类调用时必须返回值,true:返回'值';false:返回'指针'
// 注意:入参数 t不是匿名函数时不能使用 isReturnVal=true
func (ru ReflectUtils) CreateNewInstance(t reflect.Type, isReturnVal bool) interface{} {
if t.Kind() != reflect.Struct {
return nil
}
ptr := reflect.New(t)
val := ptr.Elem()
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
if !f.Anonymous { //是否匿名类
zero := reflect.Zero(f.Type)
val.Field(i).Set(zero)
continue
}
subVal := ru.CreateNewInstance(f.Type, f.Anonymous) //匿名类型必须以指针返回
if subVal != nil {
sub := reflect.ValueOf(subVal) //原始
val.Field(i).Set(sub)
}
}
if isReturnVal {
return ptr.Elem().Interface() //以值返回
}
return ptr
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/tomatomeatman/golang-repository.git
git@gitee.com:tomatomeatman/golang-repository.git
tomatomeatman
golang-repository
GolangRepository
d40172334817

搜索帮助