Створюю свій перший справжній 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