mirror of
https://gitee.com/johng/gf
synced 2026-07-06 13:42:46 +08:00
save
This commit is contained in:
@ -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()
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user