Skip to content

Instantly share code, notes, and snippets.

@Ed1123
Created January 23, 2024 16:22
Show Gist options
  • Save Ed1123/bafd4bd77b9916660311766f02a5d3b3 to your computer and use it in GitHub Desktop.
Save Ed1123/bafd4bd77b9916660311766f02a5d3b3 to your computer and use it in GitHub Desktop.
Exploring how to run a function x times concurrently and get the results on a new slice. Both with buffer and unbuffered channels.
package main
import (
"fmt"
"sync"
)
func filterBufferedChannel(toFilter []int) []int {
filtered := make(chan int, len(toFilter))
var wg sync.WaitGroup
for i := 0; i < len(toFilter); i++ {
wg.Add(1)
fmt.Println("starting goroutine", i)
go func(j int) {
if toFilter[j]%2 == 0 {
filtered <- toFilter[j]
}
wg.Done()
fmt.Println("finishing goroutine", j)
}(i)
}
wg.Wait()
close(filtered)
fmt.Println("reading values from channel")
var slice []int
for value := range filtered {
slice = append(slice, value)
}
return slice
}
func filterUnbufferedChannel(toFilter []int) []int {
filtered := make(chan int)
var wg sync.WaitGroup
for i := 0; i < len(toFilter); i++ {
wg.Add(1)
fmt.Println("starting goroutine", i)
go func(j int) {
if toFilter[j]%2 == 0 {
filtered <- toFilter[j]
}
wg.Done()
fmt.Println("finishing goroutine", j)
}(i)
}
go func() {
wg.Wait()
close(filtered)
}()
fmt.Println("reading values from channel")
var slice []int
for value := range filtered {
slice = append(slice, value)
}
return slice
}
func main() {
sliceToFilter := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
filteredSlice := filterBufferedChannel(sliceToFilter)
fmt.Println("filtered slice", filteredSlice)
// filteredSlice = filterUnbufferedChannel(sliceToFilter)
// fmt.Println("filtered slice", filteredSlice)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment