in list.go [159:198]
func (e *Encoder) writeTypedList(v interface{}) error {
var err error
value := reflect.ValueOf(v)
// https://github.com/apache/dubbo-go-hessian2/issues/317
// if list is null, just return 'N'
if value.IsNil() {
e.buffer = encByte(e.buffer, BC_NULL) // 'N'
return nil
}
// check ref
if n, ok := e.checkRefMap(value); ok {
e.buffer = encRef(e.buffer, n)
return nil
}
// try to get list type name of the value type first, for hessian support pointer type.
// if not found, try to get list type name of the unpacked type.
typeName := getListTypeName(value.Type().String())
if typeName == "" {
value = UnpackPtrValue(value)
goType := UnpackPtrType(value.Type())
toType := combineGoTypeName(goType)
typeName = getListTypeName(toType)
if typeName == "" {
return perrors.New("no this type name: " + toType)
}
}
e.buffer = encByte(e.buffer, BC_LIST_FIXED) // 'V'
e.buffer = encString(e.buffer, typeName)
e.buffer = encInt32(e.buffer, int32(value.Len()))
for i := 0; i < value.Len(); i++ {
if err = e.Encode(value.Index(i).Interface()); err != nil {
return err
}
}
return nil
}