in object.go [461:494]
func (d *Decoder) decInstance(typ reflect.Type, cls *ClassInfo) (interface{}, error) {
if typ.Kind() != reflect.Struct {
return nil, perrors.Errorf("wrong type expect Struct but get:%s", typ.String())
}
vRef := reflect.New(typ)
// add pointer ref so that ref the same object
d.appendRefs(vRef.Interface())
vv := vRef.Elem()
for i := 0; i < len(cls.fieldNameList); i++ {
fieldName := cls.fieldNameList[i]
index, fieldStruct, err := findFieldWithCache(fieldName, typ)
if err != nil {
d.DecodeValue()
continue
}
// skip unexported anonymous field
if fieldStruct.PkgPath != "" {
continue
}
field := vv.FieldByIndex(index)
if err = d.decToDest(field); err != nil {
return nil, perrors.Wrapf(err, "decInstance->DecodeValue: %s", fieldName)
}
} // end for
return vRef.Interface(), nil
}