code: func (d *CatalogServiceQuery) Fetch(clients *ClientSet, opts *QueryOptions) (interface{}, *ResponseMetadata, error) {
  	select {
  	case <-d.stopCh:
  		return nil, nil, ErrStopped
  	default:
  	}
  
  	opts = opts.Merge(&QueryOptions{
  		Datacenter: d.dc,
  		Near:       d.near,
  	})
  
  	u := &url.URL{
  		Path:     "/v1/catalog/service/" + d.name,
  		RawQuery: opts.String(),
  	}
  	if d.tag != "" {
  		q := u.Query()
  		q.Set("tag", d.tag)
  		u.RawQuery = q.Encode()
  	}
  	log.Printf("[TRACE] %s: GET %s", d, u)
  
  	entries, qm, err := clients.Consul().Catalog().Service(d.name, d.tag, opts.ToConsulOpts())
  	if err != nil {
  		return nil, nil, errors.Wrap(err, d.String())
  	}
  
  	log.Printf("[TRACE] %s: returned %d results", d, len(entries))
  
  	var list []*CatalogService
  	for _, s := range entries {
  		list = append(list, &CatalogService{
  			ID:              s.ID,
  			Node:            s.Node,
  			Address:         s.Address,
  			Datacenter:      s.Datacenter,
  			TaggedAddresses: s.TaggedAddresses,
  			NodeMeta:        s.NodeMeta,
  			ServiceID:       s.ServiceID,
  			ServiceName:     s.ServiceName,
  			ServiceAddress:  s.ServiceAddress,
  			ServiceTags:     ServiceTags(deepCopyAndSortTags(s.ServiceTags)),
  			ServiceMeta:     s.ServiceMeta,
  			ServicePort:     s.ServicePort,
  		})
  	}
  
  	rm := &ResponseMetadata{
  		LastIndex:   qm.LastIndex,
  		LastContact: qm.LastContact,
  	}
  
  	return list, rm, nil
  }
docs: // Fetch queries the Consul API defined by the given client and returns a slice
  // of CatalogService objects.