code: func (conn *BytesConnectionStr) ConsumeTopic(msgClb func(message *client.ConsumerMessage), topics ...string) error {
  	conn.multiplexer.rwlock.Lock()
  	defer conn.multiplexer.rwlock.Unlock()
  
  	if conn.multiplexer.started {
  		return fmt.Errorf("ConsumeTopic can be called only if the multiplexer has not been started yet")
  	}
  
  	for _, topic := range topics {
  		// check if we have already consumed the topic
  		var found bool
  		var subs *consumerSubscription
  	LoopSubs:
  		for _, subscription := range conn.multiplexer.mapping {
  			if subscription.manual == true {
  				// do not mix dynamic and manual mode
  				continue
  			}
  			if subscription.topic == topic {
  				found = true
  				subs = subscription
  				break LoopSubs
  			}
  		}
  
  		if !found {
  			subs = &consumerSubscription{
  				manual:         false, // non-manual example
  				topic:          topic,
  				connectionName: conn.name,
  				byteConsMsg:    msgClb,
  			}
  			// subscribe new topic
  			conn.multiplexer.mapping = append(conn.multiplexer.mapping, subs)
  		}
  
  		// add subscription to consumerList
  		subs.byteConsMsg = msgClb
  	}
  
  	return nil
  }
docs: // ConsumeTopic is called to start consuming of a topic.
  // Function can be called until the multiplexer is started, it returns an error otherwise.
  // The provided channel should be buffered, otherwise messages might be lost.