Проверяет понимание идиомы range для итеративного чтения из канала в Go до его закрытия.
В Go цикл for range предоставляет элегантный способ последовательного чтения всех значений из канала. Он автоматически завершается, когда канал закрывается и все значения из него прочитаны. Это избавляет от необходимости вручную проверять состояние канала с помощью конструкции value, ok := <-ch.
package main
import "fmt"
func main() {
ch := make(chan int)
// Горутина-отправитель
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) // Обязательно закрываем канал
}()
// Горутина-получатель использует range
for value := range ch {
fmt.Println(value)
}
fmt.Println("Канал закрыт, чтение завершено")
}for range блокируется, пока в канале нет данных, и ждет новых значений.range можно только с буферизированными и небуферизированными каналами.range с каналом, который может быть закрыт несколькими отправителями, так как это вызовет панику.Применяйте for range для чтения из канала, когда у вас есть один отправитель, который гарантированно закроет канал после отправки всех данных. Это делает код чище и безопаснее, чем ручное управление чтением.