Ответ
Для автоматической генерации OpenAPI-документации в Go я работал с двумя основными инструментами: Swaggo (swag) и go-swagger.
1. Swaggo (swag)
Это самый популярный инструмент, работающий по принципу code-first. Документация генерируется на основе комментариев-аннотаций прямо в коде.
-
Процесс работы:
- Добавляются аннотации к хендлерам API.
- Запускается команда
swag init. - Инструмент генерирует
docsдиректорию с файламиswagger.json,swagger.yamlиdocs.go.
-
Пример аннотации для
gin:// @Summary Получить пользователя по ID // @Description Возвращает данные одного пользователя // @Tags users // @Accept json // @Produce json // @Param id path int true "ID пользователя" // @Success 200 {object} models.User // @Failure 404 {object} httputil.HTTPError // @Router /users/{id} [get] func GetUser(c *gin.Context) { ... } -
Плюсы: Простота, быстрая интеграция, документация всегда рядом с кодом.
-
Минусы: Ограниченная поддержка сложных типов (например, дженериков), ошибки в аннотациях могут приводить к некорректной генерации.
2. go-swagger
Более мощный и гибкий инструмент, который хорошо подходит для подхода spec-first, когда сначала пишется спецификация, а затем на её основе генерируется код.
-
Основные возможности:
- Генерация сервера и клиента на основе
swagger.ymlфайла. - Валидация запросов и моделей на основе спецификации.
- Генерация спецификации из кода (менее популярный сценарий).
- Генерация сервера и клиента на основе
-
Процесс работы (spec-first):
- Вручную или в редакторе создается
swagger.yml. - Командой
swagger generate server ...создается каркас приложения. - Разработчик реализует бизнес-логику в сгенерированных хендлерах.
- Вручную или в редакторе создается
Сравнение и выбор
| Критерий | Swaggo | go-swagger |
|---|---|---|
| Подход | Code-first (код первичен) | Spec-first (спецификация первична) |
| Сложность | Простой | Средний / Сложный |
| Гибкость | Низкая | Высокая |
| Лучший сценарий | Быстрая разработка, небольшие и средние проекты | Крупные проекты, строгие контракты API, микросервисы |
В большинстве проектов я предпочитаю Swaggo за его простоту. Для сложных систем, где важен строгий контракт API, go-swagger является более надежным решением.
Ответ 18+ 🔞
А, ну вот, подъехали к моей любимой теме — генерации документации на Go. Сидишь такой, пишешь API, а потом тебе говорят: «А где, блядь, документация?». И тут начинается цирк, ёпта.
Так вот, есть два главных клоуна на этой арене: Swaggo и go-swagger. И они, сука, как два разных подхода к жизни.
1. Swaggo (он же swag)
Это такой парень, который сначала делает, а потом думает. Code-first, блядь. Ты пишешь код, накидываешь в него комментариев, как будто это объедки со стола, а потом он из этого делает конфетку.
-
Как это работает, а?
- Ты пишешь хендлер, а над ним начинаешь хуярить аннотации, как будто это граффити на заборе.
- Потом кричишь в терминал
swag init. - И он, хитрая жопа, генерирует тебе папочку
docsс файликамиswagger.json,swagger.yamlиdocs.go. Всё, готово, можно показывать.
-
Вот смотри, как это выглядит для
gin(примерно так я и пишу):// @Summary Получить пользователя по ID // @Description Возвращает данные одного пользователя // @Tags users // @Accept json // @Produce json // @Param id path int true "ID пользователя" // @Success 200 {object} models.User // @Failure 404 {object} httputil.HTTPError // @Router /users/{id} [get] func GetUser(c *gin.Context) { ... }Выглядит как заклинание, но работает, ёбана!
-
Плюсы: Проще некуда, вьебался в проект за пять минут, и документация всегда приклеена к коду, как жвачка к ботинку.
-
Минусы: Если накосячишь в этих аннотациях — получишь такую кашу в
swagger.json, что сам от себя охуеешь. И с какими-нибудь хитрожопыми типами данных может затупить.
2. go-swagger
А вот это уже серьёзный дядя. Он любит порядок. Сначала план, чертёж, спецификация, а потом уже код. Spec-first, блядь. Ты сначала пишешь swagger.yml, а потом он тебе из него сервер как из конструктора собирает.
-
На что способен этот монстр:
- Может сгенерить весь каркас сервера или клиента по готовой спецификации. Красота!
- Валидирует входящие запросы по этой же спецификации. Никакого самодеятельного говна.
- Может и наоборот — из кода спецификацию вытянуть, но это как-то не очень популярно.
-
Процесс (когда ты решил жить по правилам):
- Сидишь, ковыряешься в
swagger.yml, вылизываешь каждую строчку. - Командуешь:
swagger generate server .... - Получаешь готовый скелет приложения, в который остаётся только мясо бизнес-логики запихнуть.
- Сидишь, ковыряешься в
Так что же выбрать? Сравнительная таблица на коленке
| Критерий | Swaggo | go-swagger |
|---|---|---|
| Философия | Сначала код, потом болтовня (Code-first) | Сначала план, потом стройка (Spec-first) |
| Сложность входа | Как влить пиво — просто | Как собрать мебель из IKEA — инструкция есть, но хуй знает |
| Степень свободы | Ограниченная, но для большинства хватает | Высокая, можно выёбываться как хочешь |
| Идеальный случай | Быстрая разработка, пет-проекты, микросервисы среднего калибра | Крупные, сложные системы, где контракт API — это святое |
Итог: В 80% случаев я хватаю Swaggo, потому что он быстрый и не грузит мозги. Но если вижу, что проект вырастет в нечто монструозное, где каждый чих должен быть задокументирован, или если работаю в команде, где дизайн API обсуждают отдельно — тогда без вариантов, go-swagger. Иначе потом будешь сидеть и переписывать все эти аннотации, материться, как сапожник.