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 } Birinchi kanallaridan barcha qiymatlarni birlashtiradigan va barcha kirish kanallari yopilganda yopiladigan yagona kanalni qaytaradigan merge funksiyasini amalga oshiring. Birlashtirilgan kanal yopilishi uchun barcha kirish kanallari yopilishi kerak.
sobes.tech AI
AIdan javob
merge funksiyasi bir nechta chan int kanallarni qabul qilishi va bitta kanalni qaytarishi kerak, unga kirish kanallaridan barcha qiymatlar yuboriladi. Barcha kirish kanallari yopilganida, chiqish kanali ham yopilishi kerak.
Ushbu yondashuv odatda sync.WaitGroup dan foydalanishga asoslangan bo'lib, barcha kanallar yopilishini kuzatadi va har bir kanaldan o'qish uchun goroutine'lar ishga tushiriladi.
Misol uchun:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Bir kanaldan boshqasiga qiymatlarni nusxalash funksiyasi
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)
}
// Barcha goroutine'lar tugagach, out ni yopish
go func() {
wg.Wait()
close(out)
}()
return out
}
Ushbu yondashuv kirish kanallaridagi barcha qiymatlar chiqish kanaliga yetib borishini ta'minlaydi va barcha kirish kanallari yopilgandan so'ng chiqish kanalini yopadi.