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 } Implémentez la fonction merge qui prend plusieurs canaux d'entiers et retourne un seul canal qui fusionne les valeurs de tous les canaux d'entrée. Le canal fusionné doit se fermer lorsque tous les canaux d'entrée sont fermés.
sobes.tech IA
Réponse de l'IA
La fonction merge doit accepter plusieurs canaux chan int et en renvoyer un seul, dans lequel toutes les valeurs des canaux d'entrée seront envoyées. Lorsque tous les canaux d'entrée sont fermés, le canal de sortie doit également se fermer.
L'implémentation est généralement basée sur l'utilisation de sync.WaitGroup pour suivre la fermeture de tous les canaux et sur le lancement de goroutines pour lire à partir de chaque canal.
Exemple d'implémentation :
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Fonction pour copier les valeurs d'un canal vers 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)
}
// Ferme out après que toutes les goroutines ont terminé
go func() {
wg.Wait()
close(out)
}()
return out
}
Cette approche garantit que toutes les valeurs des canaux d'entrée atteignent le canal de sortie, et que le canal de sortie se ferme après la fermeture de tous les canaux d'entrée.