Sobes.tech
Back to questions
Junior — Middle
82

Как ведет себя программа при использовании range для чтения из закрытого небуферизированного канала?

Companies where asked
Самокат Тех

Answer from AI

sobes.tech AI

При использовании range для чтения из канала в Go, цикл будет получать значения из канала до тех пор, пока канал не будет закрыт. Если канал закрыт и все значения из него уже считаны, range завершит цикл.

Для небуферизированного канала это работает так же, как и для буферизированного: если канал закрыт, range не блокируется и выходит из цикла.

Пример:

ch := make(chan int)
go func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Выведет 1 и 2, затем цикл завершится
}

Если канал закрыт, но в нем нет данных, range сразу завершится. Если канал не закрыт, но данных нет, range будет ждать (блокироваться) до появления данных или закрытия канала.