code: func NewClient(addrURIOrCluster interface{}, options ...ClientOption) (*Client, error) {
  	var cluster *Cluster
  	clientOptions := &ClientOptions{}
  	err := clientOptions.addOptions(options...)
  	if err != nil {
  		return nil, err
  	}
  
  	switch u := addrURIOrCluster.(type) {
  	case string:
  		uri, err := NewURIFromAddress(u)
  		if err != nil {
  			return nil, err
  		}
  		return newClientWithURI(uri, clientOptions), nil
  	case []string:
  		if len(u) == 1 {
  			uri, err := NewURIFromAddress(u[0])
  			if err != nil {
  				return nil, err
  			}
  			return newClientWithURI(uri, clientOptions), nil
  		} else if clientOptions.manualServerAddress {
  			return nil, ErrSingleServerAddressRequired
  		}
  		return newClientFromAddresses(u, clientOptions)
  	case *URI:
  		uriCopy := *u
  		return newClientWithURI(&uriCopy, clientOptions), nil
  	case []*URI:
  		if len(u) == 1 {
  			uriCopy := *u[0]
  			return newClientWithURI(&uriCopy, clientOptions), nil
  		} else if clientOptions.manualServerAddress {
  			return nil, ErrSingleServerAddressRequired
  		}
  		cluster = NewClusterWithHost(u...)
  	case *Cluster:
  		cluster = u
  	case nil:
  		cluster = NewClusterWithHost()
  	default:
  		return nil, ErrAddrURIClusterExpected
  	}
  
  	return newClientWithCluster(cluster, clientOptions), nil
  }
docs: // NewClient creates a client with the given address, URI, or cluster and options.