Senior
Zadanie na Merge channel Zaimplementuj funkcję merge, która przyjmuje dowolną liczbę kanałów chan string i zwraca jeden kanał wyjściowy, z którego można odczytać wszystkie wartości z przekazanych kanałów. Przekazane kanały poza funkcją merge są zamykane po zapisaniu. Po zakończeniu odczytu z połączonego kanału program powinien wyświetlić "ok".
sobes.tech AI
Odpowiedź 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".
Так можно объединить несколько каналов в один, сохраняя порядок чтения из каждого.