This commit is contained in:
Go
2024-03-31 13:20:09 +08:00
parent 5a648efd89
commit 60c094bab1
3 changed files with 18 additions and 4 deletions

View File

@ -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()

View File

@ -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,

View File

@ -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)
})
}