Go

Установщик на Go для Windows-клиента: как VOG ушёл от MSI и redist

Установщик на Go для Windows-клиента: как VOG ушёл от MSI и redist

Старый MSI-установщик VOG перестал ставиться на свежие Windows из-за распространяемого пакета Visual C++. Как вместо него появился загрузчик на Go — один статический файл без cgo и без единой сторонней зависимости, с окном на голом WinAPI, модульной установкой, откатом версий, двумя слоями подписей Ed25519 и честными отношениями с антивирусами

Дженерики в Go: type parameters, constraints и цена под капотом

Дженерики в Go: type parameters, constraints и цена под капотом

Дженерики в Go (1.18+) — не мономорфизация как в C++ и не стирание как в Java, а GC-shape stenciling со словарями. Разбираем type parameters и constraints (~, comparable, интерфейсы-ограничения), инференс типов, как это работает под капотом и что стоит — на живом стенде с бенчмарками: дженерик vs interface{} vs рукопись, и почему на указательных типах дженерик не быстрее интерфейса

Методы и ресиверы в Go: value против pointer и ловушка method set

Методы и ресиверы в Go: value против pointer и ловушка method set

Value- или pointer-ресивер — не вопрос вкуса: value-метод работает на копии (мутации теряются), а method set значения НЕ включает pointer-receiver-методы, поэтому тип с таким методом удовлетворяет интерфейсу только как *T. Разбираем выбор ресивера, method set, копирование и цену — на живом стенде

encoding/json/v2 в Go 1.27: вы уже переехали, не написав ни строки

encoding/json/v2 в Go 1.27: вы уже переехали, не написав ни строки

encoding/json в Go 1.27 работает поверх нового движка v2 по умолчанию — обновивший тулчейн уже переехал, ничего не переписывая. На бенчах стенда это стоит decode в полтора-два раза дороже, а поведение при этом не меняется вовсе: строгость и выигрыш по аллокациям даёт только явный переход на encoding/json/v2 и потоковый jsontext.

Слайсы и карты в Go: внутренности и подводные камни

Слайсы и карты в Go: внутренности и подводные камни

Слайс — это заголовок (указатель, длина, ёмкость) над общим backing-массивом, и отсюда растут коварные баги: append молча перезаписывает «соседа», nil и пустой слайс не одно и то же. Карты рандомизируют порядок обхода и роняют процесс при конкурентной записи. Разбираем внутренности и подводные камни на живых примерах

Итераторы в Go: range-over-func и пакет iter

Итераторы в Go: range-over-func и пакет iter

Go 1.23 разрешил range по функции: iter.Seq и iter.Seq2 — это функции-«пуш-итераторы», которые получают yield и вызывают его на каждом элементе. Как это работает под капотом, как писать свои итераторы, как связаны slices/maps-итераторы, ранний break и очистка — на живых примерах

Goroutine leak profile в Go 1.27: ловим утечки горутин в проде

Goroutine leak profile в Go 1.27: ловим утечки горутин в проде

Go 1.27 добавил профиль утёкших горутин — он выделяет именно те, что навсегда заблокированы на примитиве синхронизации. Что новый профиль видит, чего не видят pprof/goroutine и goleak, на воспроизводимых классах утечек, и как встроить его в мониторинг.

Обработка ошибок в Go: значения, обёртки, паники

Обработка ошибок в Go: значения, обёртки, паники

Ошибки в Go — обычные значения, а не исключения: их возвращают, оборачивают через %w, проверяют errors.Is/As сквозь цепочку и объединяют errors.Join. Разбираем sentinel и типизированные ошибки, когда уместны panic/recover, и знаменитый баг «типизированный nil в error != nil»

Интерфейсы в Go: неявность, itab и ловушка nil

Интерфейсы в Go: неявность, itab и ловушка nil

Интерфейсы в Go удовлетворяются неявно, состоят из пары (тип, значение) и потому таят знаменитую ловушку: интерфейс с типизированным nil внутри сам НЕ равен nil. Разбираем маленькие интерфейсы, «accept interfaces, return structs», внутреннее устройство (itab), type assertions/switch и почему nil-интерфейс — не то, чем кажется

Память в Go: стек, куча и escape-анализ

Память в Go: стек, куча и escape-анализ

Где живёт значение — на стеке или в куче — в Go решает не программист, а escape-анализ компилятора. Что уводит переменную в кучу (возврат указателя, боксинг в interface, захват замыканием), как это увидеть через go build -gcflags=-m, чем это грузит сборщик мусора и как проверять бенчами — на живом стенде с реальным выводом