package resolver import ( "context" "crypto/tls" "net" ) func DialTLSContext(ctx context.Context, network, address string) (net.Conn, error) { connch := make(chan net.Conn) errch := make(chan error, 1) go func() { conn, err := tls.Dial(network, address, new(tls.Config)) if err != nil { errch <- err return } select { case <-ctx.Done(): conn.Close() case connch <- conn: } }() select { case <-ctx.Done(): return nil, ctx.Err() case conn := <-connch: return conn, nil case err := <-errch: return nil, err } }