💬 Даны 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 позволяет дождаться завершения всех горутин, после чего общий канал закрывается.