Senior
21
func fanin[T any](chs ...<-chan T) chan T { out := make(chan T) wg := sync.WaitGroup{} for _, ch := range chs { wg.Add(1) go func(c <-chan T) { defer wg.Done() for v := range c { out <- v } }(ch) } go func() { wg.Wait() close(out) }() return out } func main() { ch1 := make(chan int, 5) ch2 := make(chan int, 5) for i := 1; i <= 5; i++ { ch1 <- i ch2 <- i * 2 } close(ch1) close(ch2) fmt.Println(fanin(ch1, ch2)) }
Companies where asked
01.tech
Answer from AI
sobes.tech AI
Функция fanin реализует паттерн объединения нескольких каналов в один в Go. Она принимает произвольное число входных каналов типа <-chan T и возвращает один выходной канал chan T, в который будут отправляться все значения из входных каналов.
Как это работает:
- Создаётся выходной канал
out. - Для каждого входного канала запускается горутина, которая читает из этого канала и отправляет значения в
out. - Используется
sync.WaitGroupдля ожидания завершения всех горутин. - После того, как все входные каналы закрыты и все значения переданы, выходной канал
outзакрывается.
В main создаются два канала ch1 и ch2, в которые записываются числа, затем они закрываются. Вызов fanin(ch1, ch2) объединяет эти два канала в один.
Пример использования:
package main
import (
"fmt"
"sync"
)
func fanin[T any](chs ...<-chan T) chan T {
out := make(chan T)
wg := sync.WaitGroup{}
for _, ch := range chs {
wg.Add(1)
go func(c <-chan T) {
defer wg.Done()
for v := range c {
out <- v
}
}(ch)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
func main() {
ch1 := make(chan int, 5)
ch2 := make(chan int, 5)
for i := 1; i <= 5; i++ {
ch1 <- i
ch2 <- i * 2
}
close(ch1)
close(ch2)
for v := range fanin(ch1, ch2) {
fmt.Println(v)
}
}
Этот код выведет все значения из ch1 и ch2 в произвольном порядке, так как горутины работают параллельно.