Sobes.tech
Senior

// 2 func merge(chans ...chan int) <-chan int { panic("not implemented") } func main() { a,b,c := make(chan int), make(chan int), make(chan int) out := merge(a,b,c) go func(){ for v := range out { println(v) } }() a <- 1 a <- 2 a <- 3 b <- 4 c <- 5 close(c) a <- 6 } Implementa la función merge que toma múltiples canales de enteros y devuelve un solo canal que combina los valores de todos los canales de entrada. El canal combinado debe cerrarse cuando todos los canales de entrada estén cerrados.

sobes.tech AI

Respuesta de la IA

La función merge debe aceptar varios canales chan int y devolver un solo canal, en el que se enviarán todos los valores de los canales de entrada. Cuando todos los canales de entrada estén cerrados, el canal de salida también debe cerrarse.

La implementación generalmente se basa en el uso de sync.WaitGroup para rastrear el cierre de todos los canales y en el lanzamiento de goroutines para leer de cada canal.

Ejemplo de implementación:

func merge(chans ...chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // Función para copiar valores de un canal a out
    output := func(c chan int) {
        defer wg.Done()
        for v := range c {
            out <- v
        }
    }

    wg.Add(len(chans))
    for _, c := range chans {
        go output(c)
    }

    // Cierra out después de que todas las goroutines terminen
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Este enfoque garantiza que todos los valores de los canales de entrada lleguen al canal de salida, y que el canal de salida se cierre después de que todos los canales de entrada se cierren.