package summultiples import "sync" func MultipleSummer(n ...int) func(top int) int { return func(top int) int { c := make(chan int) wg := sync.WaitGroup{} // spawn worker for _, v := range n { wg.Add(1) go func(m int) { for i := m; i < top; i += m { c <- i } wg.Done() }(v) } go func() { wg.Wait() close(c) }() // collect, uniq and sum up values var sum int seen := make(map[int]bool) for v := range c { if !seen[v] { seen[v] = true sum += v } } return sum } }