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 funzione merge che prende più canali di interi e restituisce un singolo canale che unisce i valori di tutti i canali di input. Il canale unificato dovrebbe chiudersi quando tutti i canali di input sono chiusi.

sobes.tech AI

Risposta dell'AI

La funzione merge deve accettare più canali chan int e restituire un singolo canale, in cui verranno inviati tutti i valori dei canali di input. Quando tutti i canali di input sono chiusi, anche il canale di output deve chiudersi.

L'implementazione si basa generalmente sull'uso di sync.WaitGroup per monitorare la chiusura di tutti i canali e sul lancio di goroutine per leggere da ogni canale.

Esempio di implementazione:

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

    // Funzione per copiare i valori da un canale 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)
    }

    // Chiude out dopo che tutte le goroutine sono terminate
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Questo approccio garantisce che tutti i valori dei canali di input arrivino al canale di output, e che il canale di output venga chiuso dopo la chiusura di tutti i canali di input.