💬 Даны n каналов типа chan int. Напишите функцию, которая объединит все данные из этих каналов в один и вернет его.
Решить эту задачу можно, запустив горутину для каждого входного канала, которая будет читать данные из этого канала и отправлять их в один общий канал.
📌 Вот как это можно реализовать:
Функция
Для каждого входного канала создается горутина, которая читает данные из этого канала и отправляет их в общий канал
Решить эту задачу можно, запустив горутину для каждого входного канала, которая будет читать данные из этого канала и отправлять их в один общий канал.
📌 Вот как это можно реализовать:
package main
import (
"fmt"
"sync"
)
// mergeChannels объединяет данные из нескольких каналов в один
func mergeChannels(channels ...chan int) chan int {
var wg sync.WaitGroup
merged := make(chan int)
output := func(c chan int) {
for n := range c {
merged <- n
}
wg.Done()
}
wg.Add(len(channels))
for _, c := range channels {
go output(c)
}
// Закрыть merged канал после завершения всех горутин
go func() {
wg.Wait()
close(merged)
}()
return merged
}
func main() {
// Пример использования
c1 := make(chan int)
c2 := make(chan int)
c3 := make(chan int)
// Заполнение каналов данными
go func() { c1 <- 1; close(c1) }()
go func() { c2 <- 2; close(c2) }()
go func() { c3 <- 3; close(c3) }()
// Объединение каналов
for n := range mergeChannels(c1, c2, c3) {
fmt.Println(n)
}
}
Функция
mergeChannels
принимает переменное количество каналов chan int
и возвращает один канал, в который будут направлены все данные из входных каналов. Для каждого входного канала создается горутина, которая читает данные из этого канала и отправляет их в общий канал
merged
. Использование sync.WaitGroup
позволяет дождаться завершения всех горутин, после чего общий канал закрывается.