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 } Туура ишке ашырыңыз merge функциясын, ал алты каналдарга бүтүн сандарды кабыл алат жана бардык кирүү каналдарынан маанилерди бириктирген бир канал кайтарат. Бириктирилген канал бардык кирүү каналдары жабылганда жабылышы керек.
sobes.tech AI
AIден жооп
merge функциясы бир нече chan int каналдарын кабыл алып, бир канал кайтаруусу керек, ага бардык кирүү каналдарынан келген маанилер жиберилет. Бардык кирүү каналдар жабылгандан кийин, чыгуу каналы да жабылышы керек.
Көп учурда бул ишке ашыруу sync.WaitGroup колдонуу менен ишке ашырылат, ал бардык каналдардын жабылышын көзөмөлдөйт жана ар бир каналдан окуу үчүн goroutine'лерди иштетет.
Мисал:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Бир каналдан башкасына маанилерди көчүрүү функциясы
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)
}
// Бардык goroutine'лер аяктагандан кийин out жабылат
go func() {
wg.Wait()
close(out)
}()
return out
}
Бул ыкма бардык кирүү каналдарынан келген маанилер чыгуу каналына жетишин камсыздайт жана бардык кирүү каналдары жабылгандан кийин чыгуу каналы жабылат.