code: func (d *Decoder) decodeMap(v reflect.Value) (err error) {
  	dataLen, err := d.DecodeUint()
  	if err != nil {
  		return
  	}
  
  	// Allocate storage for the underlying map if needed.
  	vt := v.Type()
  	if v.IsNil() {
  		v.Set(reflect.MakeMap(vt))
  	}
  
  	// Decode each key and value according to their type.
  	keyType := vt.Key()
  	elemType := vt.Elem()
  	for i := uint32(0); i < dataLen; i++ {
  		key := reflect.New(keyType).Elem()
  		err = d.decode(key)
  		if err != nil {
  			return
  		}
  
  		val := reflect.New(elemType).Elem()
  		err = d.decode(val)
  		if err != nil {
  			return
  		}
  		v.SetMapIndex(key, val)
  	}
  	return
  }
docs: // RFC Section 4.15 - Discriminated Union
  // RFC Section 4.16 - Void
  // RFC Section 4.17 - Constant
  // RFC Section 4.18 - Typedef
  // RFC Section 4.19 - Optional data
  // RFC Sections 4.15 though 4.19 only apply to the data specification language
  // which is not implemented by this package.  In the case of discriminated
  // unions, struct tags are used to perform a similar function.
  // decodeMap treats the next bytes as an XDR encoded variable array of 2-element
  // structures whose fields are of the same type as the map keys and elements
  // represented by the passed reflection value.  Pointers are automatically
  // indirected and allocated as necessary.
  //
  // An UnmarshalError is returned if any issues are encountered while decoding
  // the elements.