← На главную

Gin пережил Fyve: 88k звёзд, 290k зависимых

01.07.2026 17:45 · hackernews

Томас Кампос вернулся из Сан-Франциско в Испанию в 2014 году и решил написать социальную сеть Fyve на Go. Бэкенд-фреймворк для неё он написал сам — так родился Gin. Fyve умер, а Gin остался.

В то время в Go-сообществе был популярен Martini. Он выглядел круто: красивый README, элегантная модель middleware, маршруты за минуту. Но внутри Martini использовал reflection-based dependency injection. Магия работала на первом демо, но контроль над потоком терялся, а reflection выполнялся на каждом запросе. Кампос помнил идею Роба Пайка: простое ПО требует больше работы от автора, но меньше от пользователя. Easy — это красиво в первом примере. Simple — это меньше движущихся частей. Gin стал простым, а не лёгким.

Компромисс нашёлся между полным отсутствием магии (как в стандартном net/http) и избыточной магией Martini. В Gin нет reflection на пути запроса. Вся рутина спрятана в один объект — *gin.Context. Он несёт request, response writer, параметры пути, хелперы валидации и рендеринга. Всё прозрачно и дебажится. Забавно: gin.Context появился в 2014 году, за два года до стандартного context.Context в Go. Когда его добавили в стандартную библиотеку, авторы не стали переименовывать свой — они сделали gin.Context совместимым без единого breaking change.

Маршрутизатор построен на radix tree. В отличие от Martini, который перебирал список регулярных выражений, Gin использует сжатое префиксное дерево. Маршруты /search и /support делят узел /s. Для пути /blog/42/comments поиск идёт по одному пути, а не по всем зарегистрированным маршрутам. Сложность поиска — O(k), где k — длина URL, и не зависит от количества маршрутов n. Параметры лежат в предварительно выделенном слайсе, а Context берутся из sync.Pool. Это даёт меньше мусора для GC и стабильную задержку.

Главная цель проекта была — ноль breaking changes. Gin придерживался философии совместимости Go. Некоторые программы, написанные для первых версий Gin, всё ещё работают спустя десять лет.

Релиз на Hacker News попал в удачный момент. Gin легко было попробовать: один README, никакого reflection на хот-пате, хорошие бенчмарки. Сейчас у репозитория около 88k звёзд и более 290k зависящих проектов. Кампос считает зависимость важнее звёзд. Через несколько лет он передал проект мейнтейнерам — Bo-Yi Wu и Javier Provecho. Для него идеальный open source — это когда проект перестаёт нуждаться в авторе.

Читать оригинал →