code: func (c *Client) GetValues(keys []string) (map[string]string, error) {
  	branches := make(map[string]bool)
  	for _, key := range keys {
  		walkTree(c, key, branches)
  	}
  	vars := make(map[string]string)
  	for key := range branches {
  		log.Debug("getting %s from vault", key)
  		resp, err := c.client.Logical().Read(key)
  
  		if err != nil {
  			log.Debug("there was an error extracting %s", key)
  			return nil, err
  		}
  		if resp == nil || resp.Data == nil {
  			continue
  		}
  
  		// if the key has only one string value
  		// treat it as a string and not a map of values
  		if val, ok := isKV(resp.Data); ok {
  			vars[key] = val
  		} else {
  			// save the json encoded response
  			// and flatten it to allow usage of gets & getvs
  			js, _ := json.Marshal(resp.Data)
  			vars[key] = string(js)
  			flatten(key, resp.Data, vars)
  		}
  	}
  	return vars, nil
  }
docs: // GetValues queries etcd for keys prefixed by prefix.