
Дженерики в Go: чем платит архитектура за type parameters
Дженерики в Go 1.18+ убрали часть interface{} и рефлексии, но принесли раздувание бинарника, ограничения по методам и новую точку споров в код-ревью. Разбираем, где это меняет архитектуру.

Дженерики в Go 1.18+ убрали часть interface{} и рефлексии, но принесли раздувание бинарника, ограничения по методам и новую точку споров в код-ревью. Разбираем, где это меняет архитектуру.

Static-поле живёт вне объекта, инициализируется один раз и до C++17 требует определения в .cpp. Разбираем, где это выстреливает и как inline-переменные и function-local static меняют картину.

Незакрытый канал держит горутину живой, буфер прячет дедлок до пиковой нагрузки, а 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, чтобы ревью ловило пропущенный инлайнинг.