Реализуйте NewGenerator. Он запускает горутину, которая бесконечно пишет случайные числа в возвращаемый канал, и сам себя останавливает. Если из канала не читали больше 500 мс, горутина завершается и закрывает канал. Потребитель видит это как v, ok := <-ch с ok == false и понимает, что поток окончен. Утечки горутины быть не должно.
func NewGenerator() <-chan int
Пример:
ch := NewGenerator()
fmt.Println(<-ch >= 0) // true: значения идут, пока читаем
time.Sleep(700 * time.Millisecond)
_, ok := <-ch // читали с паузой дольше 500 мс
fmt.Println(ok) // false: генератор остановился и закрыл канал
Требования:
- «Бездействие» значит: с момента последней успешной отправки (или с запуска генератора) прошло 500 мс. Пока читатель берёт значения, генератор работает.
- Таймер надо сбрасывать только после успешной отправки, а не на каждой итерации цикла.
- После остановки горутина завершается, канал закрыт.
- Отправка и таймер ждут в одном
select.
Для отсчёта используйте time.Timer. В тестах допускается одно значение, которое генератор успел отправить перед остановкой, но затем обязательно ok == false.
Тесты проверяют: значения идут, пока читают; после паузы дольше 500 мс канал закрывается; при чтении с паузой 300 мс (короче таймаута) генератор живёт заметно дольше 500 мс, то есть таймер сбрасывается после каждой отправки; после остановки не остаётся лишних горутин.