Сборка с заменой JSON
Gin по умолчанию использует стандартный пакет encoding/json для сериализации и десериализации JSON. Стандартный кодировщик хорошо протестирован и полностью совместим, но он не является самым быстрым доступным вариантом. Если производительность JSON является узким местом в вашем приложении — например, в высоконагруженных API, которые сериализуют большие объёмы данных в ответах — вы можете подключить более быструю замену на этапе сборки с помощью тегов сборки. Изменения в коде не требуются.
Доступные замены
Gin поддерживает три альтернативных JSON-кодировщика. Каждый из них реализует тот же интерфейс, который ожидает Gin, поэтому ваши обработчики, middleware и логика привязки продолжат работать без изменений.
go-json
go-json — это JSON-кодировщик на чистом Go, который обеспечивает значительное улучшение производительности по сравнению с encoding/json, сохраняя полную совместимость. Работает на всех платформах и архитектурах.
go build -tags=go_json .jsoniter
jsoniter (json-iterator) — ещё одна высокопроизводительная JSON-библиотека на чистом Go. Она совместима с API encoding/json и предоставляет гибкую систему конфигурации для продвинутых сценариев использования.
go build -tags=jsoniter .sonic
sonic — это сверхбыстрый JSON-кодировщик, разработанный ByteDance. Он использует JIT-компиляцию и SIMD-инструкции для достижения максимальной пропускной способности, что делает его самым быстрым вариантом из трёх.
go build -tags="sonic avx" .Выбор замены
| Кодировщик | Поддержка платформ | Ключевое преимущество |
|---|---|---|
encoding/json (по умолчанию) | Все | Максимальная совместимость, без дополнительных зависимостей |
| go-json | Все | Хорошее ускорение, чистый Go, широкая совместимость |
| jsoniter | Все | Хорошее ускорение, гибкая конфигурация |
| sonic | Только x86_64 с AVX | Максимальная пропускная способность через JIT и SIMD |
Для большинства приложений go-json — безопасный и эффективный выбор: он работает везде и обеспечивает заметный прирост производительности. Выбирайте sonic, когда вам нужна максимальная пропускная способность JSON, а ваши серверы работают на оборудовании x86_64. Выбирайте jsoniter, если вам нужны его специфические возможности конфигурации или вы уже используете его в другом месте вашего кода.
Проверка замены
Вы можете убедиться, что замена активна, сравнив производительность сериализации с помощью простого бенчмарка или проверив таблицу символов бинарного файла:
# Сборка с go-jsongo build -tags=go_json -o myapp .
# Проверка наличия символов go-jsongo tool nm myapp | grep goccyТег сборки также работает с другими командами Go:
go run -tags=go_json .go test -tags=go_json ./...