Створюю свій перший справжній API на Go з Gin
Я переходжу від теорії до практики.
Після вивчення структур, інтерфейсів, горутин та обробки помилок, я створив робочий Orders API, використовуючи Go та фреймворк Gin.
API виконує три завдання:
- Створення замовлення
- Отримання замовлення за ID
- Виведення списку всіх замовлень
Я обрав Gin, тому що він спрощує маршрутизацію та middleware. Він надає допоміжні функції, такі як c.JSON та c.AbortWithStatusJSON. Ці інструменти дозволяють позбутися повторюваного коду.
Структура проєкту: Я використав пласку структуру пакетів, щоб усе було впорядковано:
- handler: керує HTTP-логікою.
- model: визначає структури даних.
- store: відповідає за зберігання даних.
- middleware: керує логуванням та запитами.
Ключові технічні рішення:
• Валідація даних Я використовував теги структур для JSON-серіалізації. Також я застосував теги прив'язки Gin. Це гарантує наявність обов'язкових полів та те, що суми є більшими за нуль.
• Персистентність та конкурентність
Поточна версія використовує сховище в оперативній пам'яті. Я використав sync.RWMutex для керування конкурентним доступом. Це дозволяє здійснювати кілька операцій читання одночасно, але забезпечує безпеку при записі.
• Інтерфейси
Хендлер залежить від інтерфейсу OrderStore. Йому байдуже, чи зберігаються дані в пам'яті, чи в базі даних. Це дозволяє легко замінити рівень зберігання.
• Обробка помилок
Я використовував errors.Is для перевірки конкретних помилок, таких як ErrNotFound. Це дозволяє API повертати користувачеві правильний статус-код 404.
• Middleware Я створив власний логер. Він відстежує метод, шлях, статус-код та тривалість запиту.
Ця архітектура об'єднує все, що було вивчено в попередніх частинах. Це функціональний, структурований та масштабований фундамент.
Як ви структуруєте свої проєкти на Go? Ви віддаєте перевагу пласким пакетам чи глибокій вкладеності, заснованій на доменах?
Джерело: https://dev.to/mihirmohapatra/building-my-first-real-api-in-go-with-gin-3kio