
Каналы в Go: скрытая стоимость и подводные камни
Незакрытый канал держит горутину живой, буфер прячет дедлок до пиковой нагрузки, а select с default незаметно превращает вашу очередь в busy-loop. Разбираем, где каналы стоят дороже, чем кажется.

Незакрытый канал держит горутину живой, буфер прячет дедлок до пиковой нагрузки, а select с default незаметно превращает вашу очередь в busy-loop. Разбираем, где каналы стоят дороже, чем кажется.

Сервис на Go держит нагрузку до определённого предела, а потом latency растёт вертикально, и в логах — accept: too many open files. Разбираем, что упирается первым при 100k одновременных соединений и как это мерить.

Счётчик метрик под нагрузкой в 500 горутин упёрся в contention на одном мьютексе. Разбираем, когда sync.Mutex, sync/atomic и sharding дают разную цену и как это измерить самому.

На собеседованиях любят спрашивать, чем struct отличается от class в C++. Правильный ответ короче, чем кажется, а практические последствия — глубже, чем «одно для данных, другое для логики».

Пустой HTTP-сервис на Go компилируется в 8-мегабайтный бинарь ещё до того, как вы написали бизнес-логику. Разбираем, из чего он состоит и какими флагами и приёмами его реально уменьшить.

Восемь горутин инкрементировали соседние поля одной структуры и упёрлись в 40% от ожидаемой пропускной способности. Разбираем, как кеш процессора превратил безобидные счётчики в узкое место.

На уровне языка struct и class в C++ различаются одной строкой стандарта. На уровне читаемости кода и договорённостей в команде — гораздо сильнее. Разбираем, где выбор реальный, а где косметический.

Директива go:linkname и пакет unsafe дают доступ к внутренностям рантайма Go, но ломаются между версиями и обходят проверки компилятора. Разбираем, где их применение оправдано, а где это мина в проде.

Копия структуры на каждый вызов съедает время, а лишняя ссылка ломает безопасность. Разбираем, когда брать по значению, когда по ссылке, а когда указатель — с ценой каждого решения.

Компилятор Go молча решает, встроить функцию по месту вызова или нет. На горячих путях это разница в разы. Разбираем, что искать в коде и в выводе -gcflags, чтобы ревью ловило пропущенный инлайнинг.

Фигурные скобки, круглые, знак равенства — в C++ у инициализации минимум пять форм, и они не взаимозаменяемы. Разбираем, где какая работает, где narrowing спасёт от бага, а где most vexing parse съест ваш объект.

Сервис на Go начал тратить 40% процессорного времени на сборку мусора при 5000 RPS. Разбираем, почему аллокации в куче становятся узким местом и как их найти профайлером.