From 386f38af5ebaaf999941fe8f0301c379a13208ee Mon Sep 17 00:00:00 2001 From: John Date: Tue, 16 Jun 2020 20:18:40 +0800 Subject: [PATCH] improve gconv.Struct --- util/gconv/gconv_struct.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/util/gconv/gconv_struct.go b/util/gconv/gconv_struct.go index 14cfe7410..5d48e015a 100644 --- a/util/gconv/gconv_struct.go +++ b/util/gconv/gconv_struct.go @@ -243,21 +243,26 @@ func bindVarToStructAttr(elem reflect.Value, name string, value interface{}) (er // bindVarToReflectValue sets to reflect value object . func bindVarToReflectValue(structFieldValue reflect.Value, value interface{}) (err error) { - // Converting using interface. - if !structFieldValue.IsNil() { - if v, ok := structFieldValue.Interface().(apiSet); ok { - v.Set(value) - return nil - } else if v, ok := structFieldValue.Interface().(apiUnmarshalValue); ok { - err = v.UnmarshalValue(value) - if err == nil { - return err + kind := structFieldValue.Kind() + + // Converting using interface, for some kinds. + switch kind { + case reflect.Slice, reflect.Array, reflect.Ptr, reflect.Interface: + if !structFieldValue.IsNil() { + if v, ok := structFieldValue.Interface().(apiSet); ok { + v.Set(value) + return nil + } else if v, ok := structFieldValue.Interface().(apiUnmarshalValue); ok { + err = v.UnmarshalValue(value) + if err == nil { + return err + } } } } // Converting by kind. - switch structFieldValue.Kind() { + switch kind { case reflect.Struct: if err := Struct(value, structFieldValue); err != nil { // Note there's reflect conversion mechanism here.