Home > Back-end >  Passing []net.Conn to io.MultiWriter
Passing []net.Conn to io.MultiWriter

Time:03-18

I have many of net.Conn and i want to implement multi writer. so i can send data to every available net.Conn.

My current approach is using 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)
    }
}

but the problem is, i must specify every net.Conn index in io.MultiWriter and it will be a problem, because the slice size is dynamic.

when i try another approach by pass the []net.Conn to io.MultiWriter, like code below

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

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

there is an error "cannot use mirrors (variable of type []net.Conn) as []io.Writer value in argument to io.MultiWriter"

Is there proper way to handle this case? so i can pass the net.Conn slice to io.MultiWriter.

Thank you.

CodePudding user response:

io.MultiWriter() has a param of type ...io.Writer, so you may only pass a slice of type []io.Writer.

So first create a slice of the proper type, copy the net.Conn values to it, then pass it like this:

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

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