Как безопасно накапливать и отправлять буфер

Получатель может читать тот же массив, пока отправитель уже перезаписывает его новым пакетом. Обнуление длины среза не создаёт независимую копию данных.

Короткий ответ

Что ответить на собеседовании

Получатель может читать тот же массив, пока отправитель уже перезаписывает его новым пакетом. Обнуление длины среза не создаёт независимую копию данных.

Подробный разбор

Ответ с пояснениями

Условие

Обработчик Go добавляет сообщения в []byte и отправляет пакет в goroutine записи при достижении лимита. Затем он обнуляет длину и использует тот же backing array. Какой риск возникает?

Ответ

Получатель может читать тот же массив, пока отправитель уже перезаписывает его новым пакетом. Обнуление длины среза не создаёт независимую копию данных.

Перед передачей скопируйте пакет либо передайте владение всем буфером и начните новый. Пул буферов допустим только с возвратом после полного завершения чтения. Ограничьте размер и время ожидания пакета, а при завершении отправьте остаток. Сам канал синхронизирует передачу, но не запрещает последующие конкурентные изменения массива.

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

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

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

Подробнее