Перейти к содержимому

Анонс Gin 1.12.0: поддержка BSON, улучшения контекста, производительность и многое другое

Gin v1.12.0 уже здесь

Мы рады объявить о выпуске Gin v1.12.0, наполненном новыми возможностями, значительными улучшениями производительности и основательным набором исправлений ошибок. Этот релиз углубляет поддержку Gin для современных протоколов, совершенствует опыт разработки и продолжает традицию проекта оставаться быстрым и лёгким.

Ключевые возможности

  • Поддержка протокола BSON: Слой рендеринга теперь поддерживает кодирование BSON, открывая путь к более эффективному обмену бинарными данными (#4145).

  • Новые методы контекста: Два новых хелпера делают обработку ошибок чище и идиоматичнее:

    • GetError и GetErrorSlice для типобезопасного извлечения ошибок из контекста (#4502)
    • Метод Delete для удаления ключей из контекста (#38e7651)
  • Гибкая привязка: Привязка URI и строки запроса теперь учитывает encoding.UnmarshalText, давая вам больше контроля над десериализацией пользовательских типов (#4203).

  • Опция экранированного пути: Новая опция движка позволяет использовать экранированный (исходный) путь запроса для маршрутизации (#4420).

  • Protocol Buffers в согласовании контента: context теперь поддерживает Protocol Buffers как согласуемый тип контента, упрощая интеграцию ответов в стиле gRPC (#4423).

  • Цветная задержка в логере: Логер по умолчанию теперь отображает задержку с цветом, упрощая обнаружение медленных запросов с первого взгляда (#4146).

Производительность и улучшения

  • Оптимизации дерева маршрутизатора: Множественные улучшения radix-дерева уменьшают аллокации и ускоряют парсинг путей:
    • Меньше аллокаций в findCaseInsensitivePath (#4417)
    • Парсинг путей с использованием strings.Count для эффективности (#4246)
    • Регулярные выражения заменены пользовательскими функциями в redirectTrailingSlash (#4414)
  • Оптимизация Recovery: Чтение стек-трейсов теперь более эффективно (#4466).
  • Улучшения логера: Вывод строки запроса теперь можно пропустить через конфигурацию (#4547).
  • Доверие Unix-сокетам: Заголовки X-Forwarded-For теперь всегда доверенны, когда запросы приходят через Unix-сокет (#3359).
  • Безопасность Flush: Flush() больше не паникует, когда базовый http.ResponseWriter не реализует http.Flusher (#4479).
  • Рефакторинг качества кода: Более чистая работа с map через maps.Copy и maps.Clone, именованные константы вместо магических чисел, модернизированные циклы range-over-int и многое другое (#4352, #4333, #4529, #4392).

Исправления ошибок

  • Исправлена паника маршрутизатора: Устранена паника в findCaseInsensitivePathRec при включённом RedirectFixedPath (#4535).
  • Content-Length в Data Render: Data.Render теперь корректно записывает заголовок Content-Length (#4206).
  • ClientIP с множественными заголовками: ClientIP теперь корректно обрабатывает запросы с несколькими значениями заголовка X-Forwarded-For (#4472).
  • Граничные случаи привязки: Исправлены ошибки пустых значений в привязке (#2169) и улучшена обработка пустых слайсов/массивов в привязке форм (#4380).
  • Маршруты с литеральными двоеточиями: Маршруты с литеральными двоеточиями теперь корректно работают с engine.Handler() (#4415).
  • Утечка файловых дескрипторов: RunFd теперь корректно закрывает обработчик os.File для предотвращения утечки ресурсов (#4422).
  • Поведение Hijack: Уточнено поведение hijack для корректного моделирования жизненного цикла ответа (#4373).
  • Recovery: http.ErrAbortHandler теперь подавляется в middleware recovery, как и задумано (#4336).
  • Несоответствие версии в debug: Исправлена некорректная строка версии, выводимая в режиме debug (#4403).

Сборка, зависимости и CI

  • Минимум Go 1.25: Минимальная поддерживаемая версия Go теперь 1.25, CI-пайплайны обновлены соответственно (#4550).
  • Обновление зависимости BSON: Зависимость привязки BSON обновлена до mongo-driver v2 (#4549).

Gin 1.12.0 отражает преданность нашего сообщества — контрибьюторов, ревьюеров и пользователей. Спасибо за то, что делаете Gin лучше с каждым релизом.

Готовы попробовать Gin 1.12.0? Обновитесь на GitHub и сообщите нам, что вы думаете!