in go/fury/fury.go [408:474]
func (f *Fury) readData(buffer *ByteBuffer, value reflect.Value, serializer Serializer) (err error) {
typeId := buffer.ReadInt16()
if typeId != NotSupportCrossLanguage {
var type_ reflect.Type
if typeId == FURY_TYPE_TAG {
type_, err = f.typeResolver.readTypeByReadTag(buffer)
if err != nil {
return err
}
}
if typeId < NotSupportCrossLanguage {
if f.peerLanguage != GO {
// skip peer language specific type info
_, err = f.typeResolver.readTypeInfo(buffer)
if err != nil {
return err
}
type_, err = f.typeResolver.getTypeById(-typeId)
if err != nil {
return err
}
} else {
type_, err = f.typeResolver.readType(buffer)
if err != nil {
return err
}
}
} else {
if typeId != FURY_TYPE_TAG {
type_, err = f.typeResolver.getTypeById(typeId)
if err != nil {
return err
}
}
}
if serializer == nil {
serializer, err = f.typeResolver.getSerializerByType(type_)
if err != nil {
return err
}
}
// `type_` may be more concrete than `value.Type()`. For example, `value.Type()` may be interface type.
// in serializers.
if value.Kind() == reflect.Interface {
// interfaceValue.Elem is not addressable, so we don't invoke `Elem` on interface. We create a new
// addressable concreate value to populate instead. Otherwise, we will need to handle interface in
// every serializers.
newValue := reflect.New(type_).Elem()
err := serializer.Read(f, buffer, type_, newValue)
if err != nil {
return err
}
value.Set(newValue)
return nil
} else {
// handle value nil in the serializers since default value of most types are not nil
// and for nil, those values are composite values, check is cheap.
return serializer.Read(f, buffer, type_, value)
}
} else {
typeInfo, err := f.typeResolver.readTypeInfo(buffer)
if err != nil {
return err
}
return fmt.Errorf("native objects of type %s not supported for now", typeInfo)
}
}