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.