improve gconv.Struct for nil attribute interface

This commit is contained in:
john
2020-07-14 21:34:29 +08:00
parent e1c0a92e60
commit 05cc0c4644
2 changed files with 20 additions and 9 deletions

View File

@ -138,23 +138,33 @@ func doStruct(params interface{}, pointer interface{}, recursive bool, mapping .
// The key of the attrMap is the attribute name of the struct,
// and the value is its replaced name for later comparison to improve performance.
var (
attrMap = make(map[string]string)
elemType = elem.Type()
tempName = ""
tempName string
elemFieldType reflect.StructField
elemFieldValue reflect.Value
elemType = elem.Type()
attrMap = make(map[string]string)
)
for i := 0; i < elem.NumField(); i++ {
field := elemType.Field(i)
elemFieldType = elemType.Field(i)
// Only do converting to public attributes.
if !utils.IsLetterUpper(field.Name[0]) {
if !utils.IsLetterUpper(elemFieldType.Name[0]) {
continue
}
// Maybe it's struct/*struct.
if recursive && field.Anonymous {
if err = doStruct(paramsMap, elem.Field(i), recursive, mapping...); err != nil {
if recursive && elemFieldType.Anonymous {
elemFieldValue = elem.Field(i)
// Ignore the interface attribute if it's nil.
if elemFieldValue.Kind() == reflect.Interface {
elemFieldValue = elemFieldValue.Elem()
if !elemFieldValue.IsValid() {
continue
}
}
if err = doStruct(paramsMap, elemFieldValue, recursive, mapping...); err != nil {
return err
}
} else {
tempName = field.Name
tempName = elemFieldType.Name
attrMap[tempName] = replaceCharReg.ReplaceAllString(tempName, "")
}
}

View File

@ -957,6 +957,7 @@ func Test_Struct_WithInterfaceAttr(t *testing.T) {
"name": "test",
}
err := gconv.StructDeep(v2, &v1)
t.AssertNE(err, nil)
t.Assert(err, nil)
t.Assert(v1.TestInterface, nil)
})
}