Как я могу изменить функцию Go Dialer, чтобы взять другую переменную

Я пытаюсь передать сервер в функции номеронабирателя как переменную при создании вместо того, чтобы писать новую функцию для каждого DNS-сервера. Это не может быть просто переменная, так как функция Dialer будет вызываться много раз при передаче разных серверов.

func dnsDial(ctx context.Context, network, address string) (net.Conn, error) {
        d := net.Dialer{
                Timeout: time.Millisecond * time.Duration(10000),
        }
        return d.DialContext(ctx, "udp", "8.8.8.8:53")
}

cfResolv := &net.Resolver{
        PreferGo: true,
        Dial:     dnsDial,
}

где я могу передать другой параметр, похожий на

func dnsDial(ctx context.Context, network, address, dnsServer string) (net.Conn, error) {
        d := net.Dialer{
                Timeout: time.Millisecond * time.Duration(10000),
        }
        return d.DialContext(ctx, "udp", dnsServer)
}

cfResolv := &net.Resolver{
        PreferGo: true,
        Dial:     dnsDial("8.8.8.8:53"),

}

Всего 1 ответ


Просто напишите функцию, которая возвращает номеронабиратель:

func dnsDial(dnsServer string) func(context.Context, string, string) (net.Conn, error) {
    return func(ctx context.Context, network, address string) (net.Conn, error) {
        d := net.Dialer{
            Timeout: time.Millisecond * time.Duration(10000),
        }
        return d.DialContext(ctx, "udp", dnsServer)
    }
}

cfResolv := &net.Resolver{
        PreferGo: true,
        Dial:     dnsDial("8.8.8.8:53"),
}