Go

Fan-Out / Fan-In

admin by @admin ADMIN
5d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Distribute work across N workers (fan-out), then merge their results back into one channel (fan-in). Used when you can't process items strictly in order but want to retain output as one stream.
Go
Raw
package main

import (
    "fmt"
    "sync"
)

// Fan-out: each of N workers reads from `in` and writes to its own out channel.
func fanOut(in <-chan int, n int, work func(int) int) []<-chan int {
    outs := make([]<-chan int, n)
    for i := 0; i < n; i++ {
        ch := make(chan int)
        go func() {
            defer close(ch)
            for v := range in { ch <- work(v) }
        }()
        outs[i] = ch
    }
    return outs
}

// Fan-in: merge any number of channels into one.
func fanIn[T any](chs ...<-chan T) <-chan T {
    out := make(chan T)
    var wg sync.WaitGroup
    wg.Add(len(chs))
    for _, c := range chs {
        c := c
        go func() {
            defer wg.Done()
            for v := range c { out <- v }
        }()
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

func main() {
    in := make(chan int)
    go func() {
        defer close(in)
        for i := 0; i < 20; i++ { in <- i }
    }()

    workers := fanOut(in, 4, func(n int) int { return n * n })
    for v := range fanIn(workers...) {
        fmt.Println(v)
    }
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.