Как реализовать неблокирующую очередь с лимитом

Скопируйте 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 требуется отдельный согласованный протокол: отправка в закрытый канал паникует.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее