Читать — вернёт оставшиеся данные из буфера, потом zero value. Проверять через v, ok := <-ch — ok == false значит канал закрыт и пуст.
Использовать в range — цикл завершится. Использовать в select — ветка сработает (вернёт zero value). Нельзя: писать (panic), закрывать повторно (panic).
Паттерн «broadcast»: закрытие канала разблокирует всех читателей одновременно — поэтому context.Done() работает через закрытие канала.