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 } Implementieren Sie die Funktion merge, die mehrere Kanäle von Ganzzahlen übernimmt und einen einzelnen Kanal zurückgibt, der die Werte aller Eingabekanäle zusammenführt. Der zusammengeführte Kanal sollte geschlossen werden, wenn alle Eingabekanäle geschlossen sind.
sobes.tech KI
Antwort von AI
Die Funktion merge sollte mehrere Kanäle chan int akzeptieren und einen Kanal zurückgeben, in den alle Werte der Eingabekanäle gesendet werden. Wenn alle Eingabekanäle geschlossen sind, sollte auch der Ausgabekanal geschlossen werden.
Die Implementierung basiert in der Regel auf der Verwendung von sync.WaitGroup, um das Schließen aller Kanäle zu überwachen, und auf dem Starten von Goroutines zum Lesen aus jedem Kanal.
Beispiel für eine Implementierung:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Funktion zum Kopieren von Werten aus einem Kanal in 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)
}
// Schließt out, nachdem alle Goroutines beendet sind
go func() {
wg.Wait()
close(out)
}()
return out
}
Dieser Ansatz stellt sicher, dass alle Werte aus den Eingabekanälen im Ausgabekanal landen und dass der Ausgabekanal geschlossen wird, nachdem alle Eingabekanäle geschlossen wurden.