Скопируйте request и попробуйте отправить его через select с default. Так вызывающий код не сможет изменить уже принятый payload, а переполненная очередь не заблокирует запрос.
Как реализовать неблокирующую очередь с лимитом
Скопируйте request и попробуйте отправить его через select с default. Так вызывающий код не сможет изменить уже принятый payload, а переполненная очередь не заблокирует запрос.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В Go type Scheduler struct { jobs chan []byte }; канал создан с конечной ёмкостью, не закрывается во время работы Queue. Реализуйте Queue(request []byte) error: принять копию либо вернуть ошибку переполнения.
Ответ
Скопируйте request и попробуйте отправить его через select с default. Так вызывающий код не сможет изменить уже принятый payload, а переполненная очередь не заблокирует запрос.
Реализация:
func (s *Scheduler) Queue(request []byte) error {
payload := append([]byte(nil), request...)
select {
case s.jobs <- payload:
return nil
default:
return errors.New("queue is full")
}
}
Пакет errors нужно импортировать. Ограничьте размер request до копирования. Для shutdown требуется отдельный согласованный протокол: отправка в закрытый канал паникует.