A quick go snippet I reach for often.
Fan-in channel combiner — closes out when every input closes.
package pipe
import "sync"
func FanIn[T any](inputs ...<-chan T) <-chan T {
out := make(chan T)
var wg sync.WaitGroup
wg.Add(len(inputs))
for _, in := range inputs {
go func(c <-chan T) {
defer wg.Done()
for v := range c {
out <- v
}
}(in)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
Fan-in channel combiner — closes out when every input closes.
package pipe
import "sync"
func FanIn[T any](inputs ...<-chan T) <-chan T {
out := make(chan T)
var wg sync.WaitGroup
wg.Add(len(inputs))
for _, in := range inputs {
go func(c <-chan T) {
defer wg.Done()
for v := range c {
out <- v
}
}(in)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
Open to suggestions — fork it if you can do better.
Developer Discussions