code: func ParseHostPortOrFile(s ...string) ([]string, error) {
  	var servers []string
  	for _, host := range s {
  		addr, _, err := net.SplitHostPort(host)
  		if err != nil {
  			// Parse didn't work, it is not a addr:port combo
  			if net.ParseIP(host) == nil {
  				// Not an IP address.
  				ss, err := tryFile(host)
  				if err == nil {
  					servers = append(servers, ss...)
  					continue
  				}
  				return servers, fmt.Errorf("not an IP address or file: %q", host)
  			}
  			ss := net.JoinHostPort(host, "53")
  			servers = append(servers, ss)
  			continue
  		}
  
  		if net.ParseIP(addr) == nil {
  			// No an IP address.
  			ss, err := tryFile(host)
  			if err == nil {
  				servers = append(servers, ss...)
  				continue
  			}
  			return servers, fmt.Errorf("not an IP address or file: %q", host)
  		}
  		servers = append(servers, host)
  	}
  	return servers, nil
  }
docs: // ParseHostPortOrFile parses the strings in s, each string can either be a address,
  // address:port or a filename. The address part is checked and the filename case a
  // resolv.conf like file is parsed and the nameserver found are returned.