Go в примерах: Перебор значений каналов (Range over Channels)

В предыдущем примере мы видели, как for и range обеспечивают перебор элеменов в базовых структурах данных. Можно использовать этот же синтаксис для перебора значений, полученных из канала.

package main
import "fmt"
func main() {

Будем перебирать 2 значения в канале queue.

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

Этот range проходит по каждому элементу, когда тот получен из queue. Поскольку мы закрыли канал выше, перебор завершается после получения 2 элементов. Если бы мы не закрыли канал, получили бы блокировку на 3 попытке приёма в цикле.

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

Этот пример также показывает возможность закрытия не пустого канала, всё ещё имеющего оставшиеся принимаемые значения.

Следующий пример: Таймеры (Timers).