func (d *TCPDialer) DialDualStackTimeout(addr string, timeout time.Duration) (net.Conn, error) {
	return d.dial(addr, true, timeout)
}
DialDualStackTimeout dials the given TCP addr using both tcp4 and tcp6
using the given timeout.

This function has the following additional features comparing to net.Dial:

* It reduces load on DNS resolver by caching resolved TCP addressed
for DefaultDNSCacheDuration.
* It dials all the resolved TCP addresses in round-robin manner until
connection is established. This may be useful if certain addresses
are temporarily unreachable.

This dialer is intended for custom code wrapping before passing
to Client.Dial or HostClient.Dial.

For instance, per-host counters and/or limits may be implemented
by such wrappers.

The addr passed to the function must contain port. Example addr values:

* foobar.baz:443
* foo.bar:80
* aaa.com:8080
package fasthttp
import (
	"errors"
	"net"
	"strconv"
	"sync"
	"sync/atomic"
	"time"
)
func Dial(addr string) (net.Conn, error) {
	return defaultDialer.Dial(addr)
}
func DialTimeout(addr string, timeout time.Duration) (net.Conn, error) {
	return defaultDialer.DialTimeout(addr, timeout)
}
func DialDualStack(addr string) (net.Conn, error) {
	return defaultDialer.DialDualStack(addr)
}
func DialDualStackTimeout(addr string, timeout time.Duration) (net.Conn, error) {
	return defaultDialer.DialDualStackTimeout(addr, timeout)
}
var (
	defaultDialer = &TCPDialer{Concurrency: 1000}
)
type TCPDialer struct {
	Concurrency int
	tcpAddrsLock sync.Mutex
	tcpAddrsMap  map[string]*tcpAddrEntry
	concurrencyCh chan struct{}
	once sync.Once
}
func (d *TCPDialer) Dial(addr string) (net.Conn, error) {
	return d.dial(addr, false, DefaultDialTimeout)
}
func (d *TCPDialer) DialTimeout(addr string, timeout time.Duration) (net.Conn, error) {
	return d.dial(addr, false, timeout)
}
func (d *TCPDialer) DialDualStack(addr string) (net.Conn, error) {
	return d.dial(addr, true, DefaultDialTimeout)
}