У меня много 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.Conn
io.MultiWriter
.
Спасибо.
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...)
@nothinux Вы ничего не сказали о закрытии вопроса. Также я не понимаю, в чем проблема с закрытием. У вас все еще есть фрагмент dst
, содержащий значения net.Conn
, вы могу закрываете их.
извините, я забыл упомянуть о закрытии net.Conn
. я не думал, что смогу закрыть его в dst
, я думаю, что я должен закрыть net.Conn
только после того, как сделаю это как io.Writer
. Спасибо за помощь @icza
спасибо за ответ, но мне нужно
Close
net.Conn
, если, используя этот подход, я не могу реализовать.Close
на каждомnet.Conn
, который у меня есть.