Senior
Вазифаи каналҳои Merge Функсияи merge-ро иҷро кунед, ки шумораи ҳарчи бештари каналҳои chan int-ро қабул мекунад ва як канали баромадро бармегардонад, ки аз он ҳама арзишҳои каналҳои додаашударо хондан мумкин аст. Каналҳои додаашуда берун аз функсияи merge пас аз навиштан баста мешаванд. Пас аз анҷоми хондан аз канали муттаҳидшуда, барнома бояд "ok"-ро чоп кунад.
sobes.tech AI
Ҷавоб аз AI
Ниже пример реализации функции merge, которая принимает произвольное количество каналов chan int и возвращает один канал, из которого можно читать все значения. После закрытия всех входных каналов выходной канал тоже закрывается, и программа выводит "ok".
package main
import (
"fmt"
"sync"
)
func merge(channels ...chan int) chan int {
out := make(chan int)
var wg sync.WaitGroup
wg.Add(len(channels))
for _, ch := range channels {
go func(c chan int) {
defer wg.Done()
for v := range c {
out <- v
}
}(ch)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
defer close(ch1)
ch1 <- 1
ch1 <- 2
}()
go func() {
defer close(ch2)
ch2 <- 3
ch2 <- 4
}()
merged := merge(ch1, ch2)
for v := range merged {
fmt.Println(v)
}
fmt.Println("ok")
}
В этом примере:
- Для каждого входного канала запускается горутина, которая читает из него и отправляет значения в общий канал
out. - Используется
sync.WaitGroupдля ожидания завершения чтения из всех каналов. - После того, как все входные каналы закрыты и данные прочитаны, выходной канал закрывается.
- В
mainпосле чтения всех значений выводится "ok".