code: func (c *Chain) Dial(addr string, opts ...ChainOption) (conn net.Conn, err error) {
  	options := &ChainOptions{}
  	for _, opt := range opts {
  		opt(options)
  	}
  
  	retries := 1
  	if c != nil && c.Retries > 0 {
  		retries = c.Retries
  	}
  	if options.Retries > 0 {
  		retries = options.Retries
  	}
  
  	for i := 0; i < retries; i++ {
  		conn, err = c.dialWithOptions(addr, options)
  		if err == nil {
  			break
  		}
  	}
  	return
  }
docs: // Dial connects to the target address addr through the chain.
  // If the chain is empty, it will use the net.Dial directly.