in decode.go [333:372]
func (d *Decoder) decToDest(dest reflect.Value) error {
destType := dest.Type()
destRawType := UnpackPtrType(destType)
// decode for special type, include map, slice, array.
switch destRawType.Kind() {
case reflect.Map:
return d.decMapByValue(dest)
case reflect.Slice, reflect.Array:
m, err := d.decList(TAG_READ)
if err != nil {
if perrors.Is(err, io.EOF) {
return nil
}
return perrors.WithStack(err)
}
return SetSlice(UnpackPtrValue(dest), m)
}
dec, err := d.DecodeValue()
if err != nil {
return perrors.Wrapf(err, "decToDest: %s", dest.Type().Name())
}
// if dec is nil, then return directly.
if dec == nil {
return nil
}
if ref, ok := dec.(*_refHolder); ok {
return unpackRefHolder(UnpackPtrValue(dest), destRawType, ref)
}
decValue := EnsurePackValue(dec)
SetValue(dest, decValue)
return nil
}