Go by Example: Range over Channels

In a previous example we saw how for and range provide iteration over basic data structures. We can also use this syntax to iterate over values received from a channel.

package main
import "fmt"
func main() {

We’ll iterate over 2 values in the queue channel.

	queue := make(chan string, 2)
	queue <- "one"
	queue <- "two"
	close(queue)

This range iterates over each element as it’s received from queue. Because we closed the channel above, the iteration terminates after receiving the 2 elements. If we didn’t close it we’d block on a 3rd receive in the loop.

	for elem := range queue {
		fmt.Println(elem)
	}
}
$ go run range-over-channels.go
one
two

This example also showed that it’s possible to close a non-empty channel but still have the remaining values be received.

Previous example: Closing Channels.

Next example: Timers.