From 60c094bab13efe863b4408675d89f916684a53b8 Mon Sep 17 00:00:00 2001 From: Go Date: Sun, 31 Mar 2024 13:20:09 +0800 Subject: [PATCH] save --- util/gconv/gconv_map.go | 10 +++++++--- util/gconv/gconv_maptomap.go | 9 ++++++++- util/gconv/gconv_z_unit_struct_test.go | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/util/gconv/gconv_map.go b/util/gconv/gconv_map.go index 55ab48866..187c27d94 100644 --- a/util/gconv/gconv_map.go +++ b/util/gconv/gconv_map.go @@ -365,9 +365,7 @@ func doMapConvertForMapOrStructValue(in doMapConvertForMapOrStructValueInput) in for i := 0; i < reflectValue.NumField(); i++ { rtField = reflectType.Field(i) rvField = reflectValue.Field(i) - for rvField.Kind() == reflect.Ptr { - rvField = rvField.Elem() - } + // Only convert the public attributes. fieldName := rtField.Name if !utils.IsLetterUpper(fieldName[0]) { @@ -505,6 +503,9 @@ func doMapConvertForMapOrStructValue(in doMapConvertForMapOrStructValueInput) in } dataMap[mapKey] = nestedMap default: + for rvField.Kind() == reflect.Ptr { + rvField = rvField.Elem() + } if rvField.IsValid() { dataMap[mapKey] = rvField.Interface() } else { @@ -512,6 +513,9 @@ func doMapConvertForMapOrStructValue(in doMapConvertForMapOrStructValueInput) in } } } else { + for rvField.Kind() == reflect.Ptr { + rvField = rvField.Elem() + } // No recursive map value converting if rvField.IsValid() { dataMap[mapKey] = rvField.Interface() diff --git a/util/gconv/gconv_maptomap.go b/util/gconv/gconv_maptomap.go index d9b5322dc..1c528d6c8 100644 --- a/util/gconv/gconv_maptomap.go +++ b/util/gconv/gconv_maptomap.go @@ -123,10 +123,17 @@ func doMapToMap(params interface{}, pointer interface{}, mapping ...map[string]s return err } default: + var FromValue = paramsRv.MapIndex(key) + for FromValue.Kind() == reflect.Ptr { + FromValue = FromValue.Elem() + } + for pointerValueType.Kind() == reflect.Ptr { + pointerValueType = pointerValueType.Elem() + } mapValue.Set( reflect.ValueOf( doConvert(doConvertInput{ - FromValue: paramsRv.MapIndex(key).Interface(), + FromValue: FromValue, ToTypeName: pointerValueType.String(), ReferValue: mapValue, Extra: nil, diff --git a/util/gconv/gconv_z_unit_struct_test.go b/util/gconv/gconv_z_unit_struct_test.go index b17be689e..75f1674f6 100644 --- a/util/gconv/gconv_z_unit_struct_test.go +++ b/util/gconv/gconv_z_unit_struct_test.go @@ -108,17 +108,20 @@ func Test_Struct_Attr_Pointer(t *testing.T) { type User struct { Uid *int Name *string + Open bool } user := new(User) params := g.Map{ "uid": "1", "Name": "john", + "Open": gconv.PtrBool(false), } if err := gconv.Struct(params, user); err != nil { t.Error(err) } t.Assert(user.Uid, 1) t.Assert(*user.Name, "john") + t.Assert(user.Open, true) }) }