From 3eb4adafba387bc0dfaa205f55df8cfc82f121f8 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Tue, 15 Jul 2014 11:48:30 +0800 Subject: [PATCH] Extract method FieldByName --- callback.go | 2 +- scope.go | 16 +--------------- utils.go | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/callback.go b/callback.go index 399ed85b..cab2bd94 100644 --- a/callback.go +++ b/callback.go @@ -98,7 +98,7 @@ func sortProcessors(cps []*callback_processor) []*func(scope *Scope) { } else if cp.remove { fmt.Printf("[info] removing callback `%v` from %v\n", cp.name, fileWithLineNum()) } else { - fmt.Println("[warning] duplicated callback `%v` from %v\n", cp.name, fileWithLineNum()) + fmt.Printf("[warning] duplicated callback `%v` from %v\n", cp.name, fileWithLineNum()) } } names = append(names, cp.name) diff --git a/scope.go b/scope.go index dd8c3acf..65f85f41 100644 --- a/scope.go +++ b/scope.go @@ -111,21 +111,7 @@ func (scope *Scope) HasColumn(name string) bool { // FieldByName to get column's value and existence func (scope *Scope) FieldByName(name string) (interface{}, bool) { - data := reflect.Indirect(reflect.ValueOf(scope.Value)) - - if data.Kind() == reflect.Struct { - if field := data.FieldByName(name); field.IsValid() { - return field.Interface(), true - } - } else if data.Kind() == reflect.Slice { - elem := data.Type().Elem() - if elem.Kind() == reflect.Ptr { - return nil, reflect.New(data.Type().Elem().Elem()).Elem().FieldByName(name).IsValid() - } else { - return nil, reflect.New(data.Type().Elem()).Elem().FieldByName(name).IsValid() - } - } - return nil, false + return FieldByName(name, scope.Value) } // SetColumn to set the column's value diff --git a/utils.go b/utils.go index 6acad861..b0854ff3 100644 --- a/utils.go +++ b/utils.go @@ -30,6 +30,29 @@ func (s *safeMap) Get(key string) string { return s.m[key] } +func FieldByName(name string, value interface{}, withAddr ...bool) (interface{}, bool) { + data := reflect.Indirect(reflect.ValueOf(value)) + name = snakeToUpperCamel(name) + + if data.Kind() == reflect.Struct { + if field := data.FieldByName(name); field.IsValid() { + if len(withAddr) > 0 && field.CanAddr() { + return field.Addr().Interface(), true + } else { + return field.Interface(), true + } + } + } else if data.Kind() == reflect.Slice { + elem := data.Type().Elem() + if elem.Kind() == reflect.Ptr { + return nil, reflect.New(data.Type().Elem().Elem()).Elem().FieldByName(name).IsValid() + } else { + return nil, reflect.New(data.Type().Elem()).Elem().FieldByName(name).IsValid() + } + } + return nil, false +} + func newSafeMap() *safeMap { return &safeMap{l: new(sync.RWMutex), m: make(map[string]string)} }