💬 Даны n каналов типа chan int. Напишите функцию на Go, которая объединит все данные из этих каналов в один и вернет его.



Для объединения данных из нескольких каналов типа chan int в один канал в Go, можно использовать функцию, которая итерируется по каждому каналу, читает данные и отправляет их в один общий канал.



Это можно реализовать с помощью select внутри горутины для асинхронного чтения из входных каналов. Вот простой пример функции:





package main



import (

"sync"

)



func mergeChannels(channels ...chan int) chan int {

var wg sync.WaitGroup

mergedChannel := make(chan int)



// Функция для чтения данных из канала и отправки их в объединенный канал.

output := func(c chan int) {

for n := range c {

mergedChannel <- n

}

wg.Done()

}



wg.Add(len(channels))

for _, c := range channels {

go output(c)

}



// Закрытие объединенного канала после того, как все данные из входных каналов будут обработаны.

go func() {

wg.Wait()

close(mergedChannel)

}()



return mergedChannel

}



func main() {

// Пример использования функции mergeChannels

c1 := make(chan int)

c2 := make(chan int)



// Запуск примера с фиктивным заполнением каналов

go func() {

for _, n := range []int{1, 2, 3} {

c1 <- n

}

close(c1)

}()

go func() {

for _, n := range []int{4, 5, 6} {

c2 <- n

}

close(c2)

}()



merged := mergeChannels(c1, c2)

for n := range merged {

println(n)

}

}





Этот код определяет функцию mergeChannels, которая принимает переменное количество каналов chan int и возвращает один канал chan int, в который сливаются все входящие данные. Он использует пакет sync для ожидания завершения всех операций передачи данных перед закрытием результирующего канала.