Senior
Úloha na Merge channel Implementujte funkciu merge, ktorá prijíma ľubovoľný počet kanálov chan string a vracia jeden výstupný kanál, z ktorého je možné čítať všetky hodnoty z odovzdaných kanálov. Odovzdané kanály mimo funkcie merge sa po zápise zatvoria. Po dokončení čítania z zlúčeného kanála by mal program vypísať "ok".
sobes.tech AI
Odpoveď od AI
Задача реализовать функцию merge, которая принимает несколько каналов (chan string) и возвращает один канал, из которого можно читать все значения из переданных каналов. После записи в каналы они закрываются, а после завершения чтения из объединённого канала выводится "ok".
Пример решения на Go:
func merge(channels ...<-chan string) <-chan string {
var wg sync.WaitGroup
out := make(chan string)
output := func(c <-chan string) {
defer wg.Done()
for val := range c {
out <- val
}
}
wg.Add(len(channels))
for _, c := range channels {
go output(c)
}
go func() {
wg.Wait()
close(out)
fmt.Println("ok")
}()
return out
}
Объяснение:
- Для каждого входного канала запускается горутина, которая читает из него и пишет в выходной канал.
- Используется sync.WaitGroup, чтобы дождаться завершения чтения из всех каналов.
- После закрытия всех входных каналов и завершения чтения выходной канал закрывается.
- После закрытия выводится "ok".
Так можно объединить несколько каналов в один, сохраняя порядок чтения из каждого.