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.
    for elem := range queue {
        fmt.Println(elem)
    }
}

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

$ go run range-over-channels.go
one
two
Source | License