in marshal.go [1764:1821]
func unmarshalVector(info VectorType, data []byte, value interface{}) error {
rv := reflect.ValueOf(value)
if rv.Kind() != reflect.Ptr {
return unmarshalErrorf("can not unmarshal into non-pointer %T", value)
}
rv = rv.Elem()
t := rv.Type()
k := t.Kind()
switch k {
case reflect.Slice, reflect.Array:
if data == nil {
if k == reflect.Array {
return unmarshalErrorf("unmarshal vector: can not store nil in array value")
}
if rv.IsNil() {
return nil
}
rv.Set(reflect.Zero(t))
return nil
}
if k == reflect.Array {
if rv.Len() != info.Dimensions {
return unmarshalErrorf("unmarshal vector: array of size %d cannot store vector of %d dimensions", rv.Len(), info.Dimensions)
}
} else {
rv.Set(reflect.MakeSlice(t, info.Dimensions, info.Dimensions))
}
elemSize := len(data) / info.Dimensions
for i := 0; i < info.Dimensions; i++ {
offset := 0
if isVectorVariableLengthType(info.SubType) {
m, p, err := readUnsignedVInt(data)
if err != nil {
return err
}
elemSize = int(m)
offset = p
}
if offset > 0 {
data = data[offset:]
}
var unmarshalData []byte
if elemSize >= 0 {
if len(data) < elemSize {
return unmarshalErrorf("unmarshal vector: unexpected eof")
}
unmarshalData = data[:elemSize]
data = data[elemSize:]
}
err := Unmarshal(info.SubType, unmarshalData, rv.Index(i).Addr().Interface())
if err != nil {
return unmarshalErrorf("failed to unmarshal %s into %T: %s", info.SubType, unmarshalData, err.Error())
}
}
return nil
}
return unmarshalErrorf("can not unmarshal %s into %T. Accepted types: slice, array.", info, value)
}