Ответ
В Go есть несколько способов чтения из канала:
- Простое чтение:
value := <-ch
- Чтение с проверкой на открытость (используется для определения, был ли канал закрыт и все ли значения из него прочитаны):
value, ok := <-ch
if !ok {
// Канал закрыт и больше не будет отправлять значения.
// value будет нулевым значением для типа канала.
}
- Чтение в цикле
for-range
(автоматически завершается при закрытии канала и прочтении всех отправленных значений):
for value := range ch {
// Обработка value
}
// Цикл завершится, когда канал ch будет закрыт.
- Использование
select
для чтения из нескольких каналов или с таймаутом:
select {
case value := <-ch:
// Обработка значения из канала ch
case <-time.After(1 * time.Second):
// Таймаут: чтение из канала не произошло в течение 1 секунды.
}
- Неблокирующее чтение (с использованием
default
вselect
):
select {
case value := <-ch:
// Канал готов, обработка value
default:
// Канал не готов к чтению немедленно (нет данных или заблокирован).
// Выполнение не блокируется.
}