Реализуйте Batcher, который накапливает события и сбрасывает их пачкой
(вызывает flush) при выполнении любого из условий:
- накопилось 100 событий, или
- прошло 50 мс с момента предыдущего сброса.
type Event struct {
ID int
}
type Batcher struct {
// ...
}
// NewBatcher: flush при накоплении 100 событий ИЛИ через 50ms после последнего сброса.
func NewBatcher(flush func(batch []Event)) *Batcher
func (b *Batcher) Add(event Event)
func (b *Batcher) Stop() // сбросить остаток и корректно остановить горутину
Требования:
Add потокобезопасен и не блокирует надолго.
- Каждая пачка содержит не более 100 событий.
Stop сбрасывает оставшиеся события и завершает фоновую горутину без утечек.
На что смотрит интервьюер:
- Внутренняя горутина с таймером/тикером на 50 мс и буфером событий;
Add отправляет событие во внутренний канал.
- Сброс по достижении 100 событий либо по срабатыванию таймера; пустые
пачки не сбрасываются.
Stop корректно дренирует остаток и завершает горутину; нет гонок
под -race и нет утечек горутин.