ساخت اولین API واقعی من با Go و Gin

من در حال گذار از تئوری به عمل هستم.

پس از مطالعه‌ی structها، interfaceها، goroutineها و مدیریت خطا (error handling)، یک API عملیاتی برای سفارش‌ها (Orders API) با استفاده از Go و فریم‌ورک Gin ساختم.

این API سه وظیفه را انجام می‌دهد:

  • ایجاد یک سفارش
  • دریافت یک سفارش بر اساس ID
  • لیست کردن تمام سفارش‌ها

من Gin را انتخاب کردم چون مسیریابی (routing) و میان‌افزارها (middleware) را ساده می‌کند. این فریم‌ورک توابع کمکی مانند c.JSON و c.AbortWithStatusJSON را ارائه می‌دهد. این ابزارها از نوشتن کدهای تکراری جلوگیری می‌کنند.

ساختار پروژه: من از یک چیدمان پکیج تخت (flat package layout) استفاده کردم تا همه چیز مرتب بماند:

  • handler: مدیریت منطق HTTP.
  • model: تعریف ساختار داده‌ها.
  • store: مدیریت ذخیره‌سازی داده‌ها.
  • middleware: مدیریت لاگ‌ها و درخواست‌ها.

انتخاب‌های فنی کلیدی:

• اعتبارسنجی داده‌ها (Data Validation) من از struct tagها برای سریال‌سازی JSON استفاده کردم. همچنین از Gin binding tagها بهره بردم. این کار تضمین می‌کند که فیلدهای اجباری وجود داشته باشند و مقادیر بزرگتر از صفر باشند.

• پایداری و همزمانی (Persistence and Concurrency) نسخه فعلی از یک in-memory store استفاده می‌کند. من از sync.RWMutex برای مدیریت دسترسی‌های همزمان استفاده کردم. این کار اجازه می‌دهد چندین عملیات خواندن همزمان انجام شود، اما عملیات نوشتن را ایمن نگه می‌دارد.

• اینترفیس‌ها (Interfaces) handler به اینترفیس OrderStore وابسته است. برای آن فرقی نمی‌کند که داده‌ها در حافظه باشند یا در یک پایگاه داده؛ این ویژگی تعویض لایه ذخیره‌سازی را آسان می‌کند.

• مدیریت خطا (Error Handling) من از errors.Is برای بررسی خطاهای خاص مانند ErrNotFound استفاده کردم. این کار به API اجازه می‌دهد کد وضعیت (status code) مناسب ۴۰۴ را به کاربر برگرداند.

• میان‌افزار (Middleware) من یک لاگر (logger) سفارشی ساختم. این لاگر متد، مسیر (path)، کد وضعیت و مدت‌زمان درخواست را ردیابی می‌کند.

این ساختار، تمام آنچه در بخش‌های قبلی آموخته شده بود را با هم ترکیب می‌کند. این یک زیربنای کاربردی، ساختاریافته و مقیاس‌پذیر است.

شما پروژه‌های Go خود را چگونه ساختاردهی می‌کنید؟ پکیج‌های تخت را ترجیح می‌دهید یا سلسله‌مراتب عمیق و مبتنی بر دامنه (domain-driven nesting)؟

منبع: https://dev.to/mihirmohapatra/building-my-first-real-api-in-go-with-gin-3kio