optimize: performance optimization (#7526)
This commit is contained in:
parent
9af6d510b5
commit
52b4744410
@ -448,7 +448,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create valuer, setter when parse struct
|
// create valuer, setter when parse struct
|
||||||
func (field *Field) setupValuerAndSetter() {
|
func (field *Field) setupValuerAndSetter(modelType reflect.Type) {
|
||||||
// Setup NewValuePool
|
// Setup NewValuePool
|
||||||
field.setupNewValuePool()
|
field.setupNewValuePool()
|
||||||
|
|
||||||
@ -456,13 +456,22 @@ func (field *Field) setupValuerAndSetter() {
|
|||||||
fieldIndex := field.StructField.Index[0]
|
fieldIndex := field.StructField.Index[0]
|
||||||
switch {
|
switch {
|
||||||
case len(field.StructField.Index) == 1 && fieldIndex >= 0:
|
case len(field.StructField.Index) == 1 && fieldIndex >= 0:
|
||||||
field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) {
|
field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
|
||||||
fieldValue := reflect.Indirect(value).FieldByName(field.Name)
|
v = reflect.Indirect(v)
|
||||||
|
if v.Type() != modelType {
|
||||||
|
fieldValue := v.FieldByName(field.Name)
|
||||||
|
return fieldValue.Interface(), fieldValue.IsZero()
|
||||||
|
}
|
||||||
|
fieldValue := v.Field(fieldIndex)
|
||||||
return fieldValue.Interface(), fieldValue.IsZero()
|
return fieldValue.Interface(), fieldValue.IsZero()
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
|
field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
|
||||||
v = reflect.Indirect(v)
|
v = reflect.Indirect(v)
|
||||||
|
if v.Type() != modelType {
|
||||||
|
fieldValue := v.FieldByName(field.Name)
|
||||||
|
return fieldValue.Interface(), fieldValue.IsZero()
|
||||||
|
}
|
||||||
for _, fieldIdx := range field.StructField.Index {
|
for _, fieldIdx := range field.StructField.Index {
|
||||||
if fieldIdx >= 0 {
|
if fieldIdx >= 0 {
|
||||||
v = v.Field(fieldIdx)
|
v = v.Field(fieldIdx)
|
||||||
|
@ -248,7 +248,7 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
schema.FieldsByBindName[bindName] = field
|
schema.FieldsByBindName[bindName] = field
|
||||||
}
|
}
|
||||||
|
|
||||||
field.setupValuerAndSetter()
|
field.setupValuerAndSetter(modelType)
|
||||||
}
|
}
|
||||||
|
|
||||||
prioritizedPrimaryField := schema.LookUpField("id")
|
prioritizedPrimaryField := schema.LookUpField("id")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user