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 } Izpildiet funkciju merge, kas pieņem vairākus veselo skaitļu kanālus un atgriež vienu kanālu, kas apvieno visu ievades kanālu vērtības. Apvienotajam kanālam jāaizveras, kad visi ievades kanāli ir aizvērti.
sobes.tech AI
Atbilde no AI
Funkcija merge jāņem vairākus chan int kanālus un jāatgriež viens kanāls, kurā tiks nosūtītas visas ieejas kanālu vērtības. Kad visi ieejas kanāli tiks slēgti, arī izejas kanālam jābūt slēgtam.
Implementācija parasti balstās uz sync.WaitGroup izmantošanu, lai uzraudzītu visu kanālu slēgšanu un palaistu goroutines, lai lasītu no katra kanāla.
Piemērs:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Funkcija, lai kopētu vērtības no viena kanāla uz 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)
}
// Aizver out pēc visu goroutine pabeigšanas
go func() {
wg.Wait()
close(out)
}()
return out
}
Šī pieeja nodrošina, ka visas ieejas kanālu vērtības nonāk izejas kanālā, un izejas kanāls tiks aizvērts pēc visu ieejas kanālu aizvēršanas.