func()

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
}