code: func (c *Client) Send(ctx context.Context, req *discclient.Request, targets ...fab.PeerConfig) ([]Response, error) {
  	if len(targets) == 0 {
  		return nil, errors.New("no targets specified")
  	}
  
  	var lock sync.Mutex
  	var wg sync.WaitGroup
  	wg.Add(len(targets))
  
  	var responses []Response
  	var errs error
  
  	for _, t := range targets {
  		go func(target fab.PeerConfig) {
  			defer wg.Done()
  
  			resp, err := c.send(ctx, req, target)
  			lock.Lock()
  			if err != nil {
  				errs = multi.Append(errs, errors.WithMessage(err, "From target: "+target.URL))
  				logger.Debugf("... got discovery error response from [%s]: %s", target.URL, err)
  			} else {
  				responses = append(responses, &response{Response: resp, target: target.URL})
  				logger.Debugf("... got discovery response from [%s]", target.URL)
  			}
  			lock.Unlock()
  		}(t)
  	}
  	wg.Wait()
  
  	return responses, errs
  }
docs: // Send retrieves information about channel peers, endorsers, and MSP config from the
  // given set of peers. A set of successful responses is returned and/or an error
  // is returned from each of the peers that was unsuccessful (note that if more than one peer returned
  // an error then the returned error may be cast to multi.Errors).