code: func (c *Conn) GetCatNodeInfo(fields []string) (catNodes []CatNodeInfo, err error) {
  
  	catNodes = make([]CatNodeInfo, 0)
  
  	// If no fields have been specified, use the "default" arrangement
  	if len(fields) < 1 {
  		fields = []string{"host", "ip", "heap.percent", "ram.percent", "load",
  			"node.role", "master", "name"}
  	}
  
  	// Issue a request for stats on the requested fields
  	args := map[string]interface{}{
  		"bytes": "b",
  		"h":     strings.Join(fields, ","),
  	}
  	indices, err := c.DoCommand("GET", "/_cat/nodes/", args, nil)
  	if err != nil {
  		return catNodes, err
  	}
  
  	// Create a CatIndexInfo for each line in the response
  	indexLines := strings.Split(string(indices[:]), "\n")
  	for _, index := range indexLines {
  
  		// Ignore empty output lines
  		if len(index) < 1 {
  			continue
  		}
  
  		// Create a CatNodeInfo and append it to the result
  		info, err := newCatNodeInfo(fields, index)
  		if info != nil {
  			catNodes = append(catNodes, *info)
  		} else if err != nil {
  			return catNodes, err
  		}
  	}
  	return catNodes, nil
  }
docs: // GetCatNodeInfo issues an elasticsearch cat nodes request with the specified
  // fields and returns a list of CatNodeInfos, one for each node, whose requested
  // members are populated with statistics. If fields is nil or empty, the default
  // cat output is used.
  // NOTE: if you include the name field, make sure it is the last field in the
  // list, because name values can contain spaces which screw up the parsing