из файла вычитывается в буфер некий объем данных и порционно отправляется в небуферезированный канал.
Обнаружил что:
1) первая итерация не блокирует горутину в которой происходит отправка, и горутинка спокойно может отправить туда несколько порций данных вида []byte
2) при получении в слайсе оказывается последняя переданная порция данных. Остальные ранее отправленные уходят в никуда.
Происходит это как я понимаю, из-за того, что в канал уходит слайс как ссылка на низлежащий массив данные в котором свободно меняются и перезаписываются. Но не совсем понятно почему происходит несколько итераций записи в канал.
это вы, коллега, что-то не так делаете. то есть - буфер надо создавать каждый раз новый, если вы его куда-то отправляете, но все остальное - алгоритмическая ошибка в вашем коде
1. Либо канал-таки буферизированный, либо из канала происходит где-то чтение, в результате чего блокировка сразу снимается
Понятно, что это я не так делаю. поэтому и прошу разъяснений ) Подойдет ли для таких целей bytes.NewBuffer? с очисткой каждую итерацию?
Вы бы пример кода сделали и выложили вот сюда https://go.dev/play/
Нет и нет. Есть подозрение, что передается один и тот же слайс. Буфер явно установил в 0. Чтение вещде убрал для тестов все равно цикл проворачивается 2 раза. Отсюда и непонятки
Сварганил небольшой пример: https://go.dev/play/p/G6D47_en5J0. Обратите внимание на то, что если б блокировка не происходила, то вывод был бы таким, что "Not locked" выводилось бы в самом начале. А оно вклинивается между hello и world. Если канал переделаете на буферизированный, то увидите разницу
Спасибо, сейчас разберемся
Обсуждают сегодня