动态结构体支持赋值

This commit is contained in:
白茶清欢 2025-01-24 18:06:29 +08:00
parent c757e551a8
commit c503187022

View File

@ -12,6 +12,15 @@ import (
"reflect" "reflect"
) )
func NewMap2DynamicStruct(mapData map[string]any, tagTable map[string]string) *DynamicStruct {
d := NewDynamic()
d.mapData = mapData
for k, v := range mapData {
d.AddAny(String(k).SnakeCaseToCamel(), tagTable[k], "", v)
}
return d
}
func NewDynamic() *DynamicStruct { func NewDynamic() *DynamicStruct {
return &DynamicStruct{ return &DynamicStruct{
structFieldList: make([]reflect.StructField, 0), structFieldList: make([]reflect.StructField, 0),
@ -25,6 +34,7 @@ func NewDynamic() *DynamicStruct {
// Date : 16:48 2024/8/21 // Date : 16:48 2024/8/21
type DynamicStruct struct { type DynamicStruct struct {
structFieldList []reflect.StructField // 结构体字段列表 structFieldList []reflect.StructField // 结构体字段列表
mapData map[string]any
} }
// AddInt 添加int字段统一Int64 // AddInt 添加int字段统一Int64
@ -172,7 +182,18 @@ func (ds *DynamicStruct) GetStructType() reflect.Type {
// Date : 16:56 2024/8/21 // Date : 16:56 2024/8/21
func (ds *DynamicStruct) ToStructDefaultValue() any { func (ds *DynamicStruct) ToStructDefaultValue() any {
defer ds.Clear() defer ds.Clear()
defaultValue := reflect.New(ds.GetStructType()).Elem().Interface() reflectValue := reflect.New(ds.GetStructType()).Elem()
if len(ds.mapData) > 0 {
// 开始赋值
for field, val := range ds.mapData {
realField := String(field).SnakeCaseToCamel()
findFieldValue := reflectValue.FieldByName(realField)
if findFieldValue.CanSet() {
findFieldValue.Set(reflect.ValueOf(val))
}
}
}
defaultValue := reflectValue.Interface()
return defaultValue return defaultValue
} }