Skip to content

Instantly share code, notes, and snippets.

@nbari
Last active January 19, 2016 13:14
Show Gist options
  • Save nbari/dc9950cd01e6ae6d4860 to your computer and use it in GitHub Desktop.
Save nbari/dc9950cd01e6ae6d4860 to your computer and use it in GitHub Desktop.
Fan-Out golang
package main
import (
"fmt"
"sync"
"time"
)
type myStruct struct {
key int
val string
}
func fanOut(ch <-chan myStruct, size int) []chan myStruct {
cs := make([]chan myStruct, size)
for i, _ := range cs {
cs[i] = make(chan myStruct)
}
go func() {
for i := range ch {
for _, c := range cs {
c <- i
}
}
for _, c := range cs {
close(c)
}
}()
return cs
}
func consumer(wg *sync.WaitGroup, cin <-chan myStruct) {
for i := range cin {
fmt.Printf("received %v\n", i)
time.Sleep(1 * time.Second)
wg.Done()
}
}
func main() {
var wg sync.WaitGroup
ms1 := myStruct{1, "hola"}
ms2 := myStruct{2, "hallo"}
ch := make(chan myStruct)
go func() {
ch <- ms1
ch <- ms2
close(ch)
}()
c := fanOut(ch, 3)
wg.Add(len(c) * 2)
for i := 0; i < len(c); i++ {
go consumer(&wg, c[i])
}
wg.Wait()
fmt.Println("Done")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment