Buffered Channels
for value := range ch{
...
}
- Iterator over values received from a channel.
- Loop automatically breaks, when a channel is closed.
- Range does not return the second boolean value.
Unbuffered Channels
- Synchronous
ch := make(chan T)
Buffered Channels
- Asynchronous
- Channels are given capacity
- in-memory FIFO queue
ch := make(chan T, capacity)

Exercises
Range
https://go.dev/play/p/o535FRB4mV8
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 6; i++ {
// send iterator over channel
ch <- i
}
close(ch)
}()
// range over channel to recv values
for value := range ch {
fmt.Println(value)
}
}
0
1
2
3
4
5
Buffered Channels
https://go.dev/play/p/rg1tmIAi8HX
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 6)
go func() {
defer close(ch)
// send all iterator values on channel without blocking
for i := 0; i < 6; i++ {
fmt.Printf("Sending: %d\n", i)
ch <- i
}
}()
for v := range ch {
fmt.Printf("Received: %v\n", v)
}
}
Sending: 0
Sending: 1
Sending: 2
Sending: 3
Sending: 4
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Sending: 5
Received: 5