in marshal.go [1886:1947]
func marshalMap(info TypeInfo, value interface{}) ([]byte, error) {
mapInfo, ok := info.(CollectionType)
if !ok {
return nil, marshalErrorf("marshal: can not marshal none collection type into map")
}
if value == nil {
return nil, nil
} else if _, ok := value.(unsetColumn); ok {
return nil, nil
}
rv := reflect.ValueOf(value)
t := rv.Type()
if t.Kind() != reflect.Map {
return nil, marshalErrorf("can not marshal %T into %s", value, info)
}
if rv.IsNil() {
return nil, nil
}
buf := &bytes.Buffer{}
n := rv.Len()
if err := writeCollectionSize(mapInfo, n, buf); err != nil {
return nil, err
}
keys := rv.MapKeys()
for _, key := range keys {
item, err := Marshal(mapInfo.Key, key.Interface())
if err != nil {
return nil, err
}
itemLen := len(item)
// Set the key to null for supported protocols
if item == nil && mapInfo.proto > protoVersion2 {
itemLen = -1
}
if err := writeCollectionSize(mapInfo, itemLen, buf); err != nil {
return nil, err
}
buf.Write(item)
item, err = Marshal(mapInfo.Elem, rv.MapIndex(key).Interface())
if err != nil {
return nil, err
}
itemLen = len(item)
// Set the value to null for supported protocols
if item == nil && mapInfo.proto > protoVersion2 {
itemLen = -1
}
if err := writeCollectionSize(mapInfo, itemLen, buf); err != nil {
return nil, err
}
buf.Write(item)
}
return buf.Bytes(), nil
}