Классический баг: горутина пишет n значений в небуферизированный канал, но
потребитель читает не все значения и уходит. Поскольку канал небуферизированный,
каждая отправка блокируется до тех пор, пока кто-то не прочитает. Когда читатель
останавливается, горутина-продьюсер навсегда зависает на операции ch <- i —
это утечка горутины (goroutine leak): она никогда не завершится, а её стек и
ресурсы останутся в памяти на всё время жизни процесса.
Реализуйте produce так, чтобы продьюсер гарантированно завершался, даже
если потребитель прочитал не все значения. Для этого используйте канал done:
как только потребитель его закрывает, горутина должна выйти, а не виснуть на
отправке.
// produce запускает горутину, которая шлёт значения 1..n в возвращаемый канал.
// Потребитель может прочитать НЕ ВСЕ значения. Горутина-продьюсер не должна
// утекать: дайте ей возможность завершиться (через done-канал).
func produce(n int, done <-chan struct{}) <-chan int {
// Ваша реализация
}
На что смотрит интервьюер:
- Понимание, почему отправка в небуферизированный канал блокируется и приводит к
утечке, если читатель ушёл.
- Использование
select с веткой <-done для разблокировки отправки.
- Нет утечки горутин: после
close(done) продьюсер завершается.