v0.0.159
This commit is contained in:
@@ -7,19 +7,56 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (c *Coll[TData]) init() {
|
||||
func (c *Coll[TData]) EnsureInitializedReflection(v TData) {
|
||||
|
||||
c.dataTypeMap = make(map[string]fullTypeRef[TData])
|
||||
if !c.isInterfaceDataType {
|
||||
return // only dynamically load dataTypeMap on interface TData
|
||||
}
|
||||
|
||||
rval := reflect.ValueOf(v)
|
||||
|
||||
for rval.Type().Kind() == reflect.Pointer {
|
||||
rval = rval.Elem()
|
||||
}
|
||||
|
||||
if _, ok := c.implDataTypeMap[rval.Type()]; ok {
|
||||
return // already loaded
|
||||
}
|
||||
|
||||
m := make(map[string]fullTypeRef)
|
||||
|
||||
c.initFields("", rval, m, make([]int, 0))
|
||||
|
||||
c.implDataTypeMap[rval.Type()] = m
|
||||
}
|
||||
|
||||
func (c *Coll[TData]) init() {
|
||||
|
||||
example := *new(TData)
|
||||
|
||||
v := reflect.ValueOf(example)
|
||||
datatype := reflect.TypeOf(&example).Elem()
|
||||
|
||||
c.initFields("", v, make([]int, 0))
|
||||
if datatype.Kind() == reflect.Interface {
|
||||
|
||||
c.isInterfaceDataType = true
|
||||
|
||||
c.dataTypeMap = make(map[string]fullTypeRef)
|
||||
c.implDataTypeMap = make(map[reflect.Type]map[string]fullTypeRef)
|
||||
} else {
|
||||
|
||||
c.isInterfaceDataType = false
|
||||
|
||||
c.dataTypeMap = make(map[string]fullTypeRef)
|
||||
c.implDataTypeMap = make(map[reflect.Type]map[string]fullTypeRef)
|
||||
|
||||
v := reflect.ValueOf(example)
|
||||
c.initFields("", v, c.dataTypeMap, make([]int, 0))
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int) {
|
||||
func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, m map[string]fullTypeRef, idxarr []int) {
|
||||
|
||||
rtyp := rval.Type()
|
||||
|
||||
@@ -50,7 +87,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
|
||||
|
||||
if rvfield.Type().Kind() == reflect.Pointer {
|
||||
|
||||
c.dataTypeMap[fullKey] = fullTypeRef[TData]{
|
||||
m[fullKey] = fullTypeRef{
|
||||
IsPointer: true,
|
||||
RealType: rvfield.Type(),
|
||||
Kind: rvfield.Type().Elem().Kind(),
|
||||
@@ -62,7 +99,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
|
||||
|
||||
} else {
|
||||
|
||||
c.dataTypeMap[fullKey] = fullTypeRef[TData]{
|
||||
m[fullKey] = fullTypeRef{
|
||||
IsPointer: false,
|
||||
RealType: rvfield.Type(),
|
||||
Kind: rvfield.Type().Kind(),
|
||||
@@ -75,7 +112,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
|
||||
}
|
||||
|
||||
if rvfield.Kind() == reflect.Struct {
|
||||
c.initFields(fullKey+".", rvfield, newIdxArr)
|
||||
c.initFields(fullKey+".", rvfield, m, newIdxArr)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -102,7 +139,7 @@ func (c *Coll[TData]) getFieldValueAsTokenString(entity TData, fieldName string)
|
||||
|
||||
}
|
||||
|
||||
func (c *Coll[TData]) getFieldType(fieldName string) fullTypeRef[TData] {
|
||||
func (c *Coll[TData]) getFieldType(fieldName string) fullTypeRef {
|
||||
return c.dataTypeMap[fieldName]
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user