Sobes.tech
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 в произвольном порядке, так как горутины работают параллельно.