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