Передача []net.Conn в io.MultiWriter

У меня много net.Conn и я хочу реализовать мультирайтер. поэтому я могу отправлять данные всем доступным net.Conn.

Мой текущий подход использует io.MultiWriter.

func route(conn, dst []net.Conn) {
    targets := io.MultiWriter(dst[0], dst[1])

    _, err := io.Copy(targets, conn)
    if err != nil {
        log.Println(err)
    }
}

но проблема в том, что я должен указать каждый индекс net.Conn в io.MultiWriter, и это будет проблемой, потому что размер фрагмента является динамическим.

когда я пробую другой подход, передаю []net.Conn в io.MultiWriter, как код ниже

func route(conn, dst []net.Conn) {
    targets := io.MultiWriter(dst...)

    _, err := io.Copy(targets, conn)
    if err != nil {
        log.Println(err)
    }
}

возникает ошибка "невозможно использовать зеркала (переменная типа []net.Conn) в качестве значения []io.Writer в аргументе для io.MultiWriter"

Есть ли правильный способ справиться с этим случаем? так что я могу передать кусочек net.Connio.MultiWriter.

Спасибо.

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

io.MultiWriter() имеет параметр типа ...io.Writer, поэтому вы можете передавать только фрагмент типа []io.Writer.

Итак, сначала создайте фрагмент нужного типа, скопируйте в него значения net.Conn, а затем передайте его следующим образом:

ws := make([]io.Writer, len(dst))
for i, c := range dst {
    ws[i] = c
}

targets := io.MultiWriter(ws...)

спасибо за ответ, но мне нужно Closenet.Conn, если, используя этот подход, я не могу реализовать .Close на каждом net.Conn, который у меня есть.

nothinux 18.03.2022 08:01

@nothinux Вы ничего не сказали о закрытии вопроса. Также я не понимаю, в чем проблема с закрытием. У вас все еще есть фрагмент dst, содержащий значения net.Conn, вы могу закрываете их.

icza 18.03.2022 08:03

извините, я забыл упомянуть о закрытии net.Conn. я не думал, что смогу закрыть его в dst, я думаю, что я должен закрыть net.Conn только после того, как сделаю это как io.Writer. Спасибо за помощь @icza

nothinux 18.03.2022 08:26

Другие вопросы по теме