Created
March 7, 2022 00:17
-
-
Save armando-couto/fcf93acc22c302d205a79b5b023ba316 to your computer and use it in GitHub Desktop.
Channels are uniquely suited to constructing pipelines in Go because they fulfill all of our basic requirements. They can receive and emit values, they can safely be used concurrently, they can be ranged over, and they are reified by the language. Let’s take a moment and convert the previous example to utilize channels instead
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
func main() { | |
generator := func(done <-chan interface{}, integers ...int) <-chan int { | |
intStream := make(chan int) | |
go func() { | |
defer close(intStream) | |
for _, i := range integers { | |
select { | |
case <-done: | |
return | |
case intStream <- i: | |
} | |
} | |
}() | |
return intStream | |
} | |
multiply := func( | |
done <-chan interface{}, intStream <-chan int, multiplier int, | |
) <-chan int { | |
multipliedStream := make(chan int) | |
go func() { | |
defer close(multipliedStream) | |
for i := range intStream { | |
select { | |
case <-done: | |
return | |
case multipliedStream <- i * multiplier: | |
} | |
} | |
}() | |
return multipliedStream | |
} | |
add := func( | |
done <-chan interface{}, intStream <-chan int, additive int, | |
) <-chan int { | |
addedStream := make(chan int) | |
go func() { | |
defer close(addedStream) | |
for i := range intStream { | |
select { | |
case <-done: | |
return | |
case addedStream <- i + additive: | |
} | |
} | |
}() | |
return addedStream | |
} | |
done := make(chan interface{}) | |
defer close(done) | |
intStream := generator(done, 1, 2, 3, 4) | |
pipeline := multiply(done, add(done, multiply(done, intStream, 2), 1), 2) | |
for v := range pipeline { | |
fmt.Println(v) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment