Ответ
Для автоматической генерации 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 является более надежным решением.