code: func (p *Processor) Marshal(msg interface{}) ([][]byte, error) {
  	msgType := reflect.TypeOf(msg)
  	if msgType == nil || msgType.Kind() != reflect.Ptr {
  		return nil, errors.New("json message pointer required")
  	}
  	msgID := msgType.Elem().Name()
  	if _, ok := p.msgInfo[msgID]; !ok {
  		return nil, fmt.Errorf("message %v not registered", msgID)
  	}
  
  	// data
  	m := map[string]interface{}{msgID: msg}
  	data, err := json.Marshal(m)
  	return [][]byte{data}, err
  }
docs: // goroutine safe