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 funcția merge care acceptă mai multe canale de întregi și returnează un singur canal care combină valorile din toate canalele de intrare. Canalul combinat trebuie să se închidă atunci când toate canalele de intrare sunt închise.

sobes.tech AI

Răspuns de la AI

Funcția merge trebuie să accepte mai multe canale chan int și să returneze un singur canal, în care vor fi trimise toate valorile din canalele de intrare. Când toate canalele de intrare sunt închise, și canalul de ieșire trebuie să se închidă.

Implementarea se bazează de obicei pe utilizarea sync.WaitGroup pentru a urmări închiderea tuturor canalelor și pe lansarea goroutine-urilor pentru citirea din fiecare canal.

Exemplu de implementare:

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

    // Funcție pentru copierea valorilor dintr-un canal în 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)
    }

    // Închide out după ce toate goroutine-urile s-au terminat
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Această abordare garantează că toate valorile din canalele de intrare ajung în canalul de ieșire, iar canalul de ieșire se închide după închiderea tuturor canalelor de intrare.