in marshal.go [1590:1646]
func marshalList(info TypeInfo, value interface{}) ([]byte, error) {
listInfo, ok := info.(CollectionType)
if !ok {
return nil, marshalErrorf("marshal: can not marshal non collection type into list")
}
if value == nil {
return nil, nil
} else if _, ok := value.(unsetColumn); ok {
return nil, nil
}
rv := reflect.ValueOf(value)
t := rv.Type()
k := t.Kind()
if k == reflect.Slice && rv.IsNil() {
return nil, nil
}
switch k {
case reflect.Slice, reflect.Array:
buf := &bytes.Buffer{}
n := rv.Len()
if err := writeCollectionSize(listInfo, n, buf); err != nil {
return nil, err
}
for i := 0; i < n; i++ {
item, err := Marshal(listInfo.Elem, rv.Index(i).Interface())
if err != nil {
return nil, err
}
itemLen := len(item)
// Set the value to null for supported protocols
if item == nil && listInfo.proto > protoVersion2 {
itemLen = -1
}
if err := writeCollectionSize(listInfo, itemLen, buf); err != nil {
return nil, err
}
buf.Write(item)
}
return buf.Bytes(), nil
case reflect.Map:
elem := t.Elem()
if elem.Kind() == reflect.Struct && elem.NumField() == 0 {
rkeys := rv.MapKeys()
keys := make([]interface{}, len(rkeys))
for i := 0; i < len(keys); i++ {
keys[i] = rkeys[i].Interface()
}
return marshalList(listInfo, keys)
}
}
return nil, marshalErrorf("can not marshal %T into %s. Accepted types: slice, array, map[]struct.", value, info)
}