From c0b910e7d384cd2a0624bda1ae654632a4c79a9a Mon Sep 17 00:00:00 2001 From: daheige Date: Tue, 13 Apr 2021 22:34:34 +0800 Subject: [PATCH] feat: optimize relect value length and value --- callbacks/associations.go | 5 +++-- schema/utils.go | 6 +++--- statement.go | 12 ++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/callbacks/associations.go b/callbacks/associations.go index 2a4efbe1..6d74f20d 100644 --- a/callbacks/associations.go +++ b/callbacks/associations.go @@ -288,12 +288,13 @@ func SaveAfterAssociations(create bool) func(db *gorm.DB) { appendToElems(db.Statement.ReflectValue) } - if elems.Len() > 0 { + // optimize elems of reflect value length + if elemLen := elems.Len(); elemLen > 0 { if v, ok := selectColumns[rel.Name+".*"]; !ok || v { saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil) } - for i := 0; i < elems.Len(); i++ { + for i := 0; i < elemLen; i++ { appendToJoins(objs[i], elems.Index(i)) } } diff --git a/schema/utils.go b/schema/utils.go index d311c61b..add22047 100644 --- a/schema/utils.go +++ b/schema/utils.go @@ -71,10 +71,10 @@ func GetRelationsValues(reflectValue reflect.Value, rels []*Relationship) (refle reflectResults = reflect.Append(reflectResults, result.Addr()) case reflect.Slice, reflect.Array: for i := 0; i < result.Len(); i++ { - if result.Index(i).Kind() == reflect.Ptr { - reflectResults = reflect.Append(reflectResults, result.Index(i)) + if elem := result.Index(i); elem.Kind() == reflect.Ptr { + reflectResults = reflect.Append(reflectResults, elem) } else { - reflectResults = reflect.Append(reflectResults, result.Index(i).Addr()) + reflectResults = reflect.Append(reflectResults, elem.Addr()) } } } diff --git a/statement.go b/statement.go index 7a827ca8..099c66d2 100644 --- a/statement.go +++ b/statement.go @@ -328,8 +328,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) [] } else if _, ok := v[key].(Valuer); ok { conds = append(conds, clause.Eq{Column: key, Value: v[key]}) } else { - values := make([]interface{}, reflectValue.Len()) - for i := 0; i < reflectValue.Len(); i++ { + // optimize relect value length + valueLen := reflectValue.Len() + values := make([]interface{}, valueLen) + for i := 0; i < valueLen; i++ { values[i] = reflectValue.Index(i).Interface() } @@ -396,8 +398,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) [] if len(args) == 1 { switch reflectValue.Kind() { case reflect.Slice, reflect.Array: - values := make([]interface{}, reflectValue.Len()) - for i := 0; i < reflectValue.Len(); i++ { + // optimize relect value length + valueLen := reflectValue.Len() + values := make([]interface{}, valueLen) + for i := 0; i < valueLen; i++ { values[i] = reflectValue.Index(i).Interface() }