ما هو Gin ولماذا هو مطلوب؟
\n\nGin هو إطار عمل ويب عالي الأداء للغة البرمجة Go، مكتوب بلغة Go النقية دون تبعيات خارجية. يوفر للمطورين مجموعة أدوات بسيطة ولكنها قوية لإنشاء REST API وتطبيقات الويب والخدمات المصغرة. الأسباب الرئيسية لاختيار Gin:
\n\n- \n
- السرعة: يستخدم Gin موجهًا خاصًا يعتمد على شجرة (Radix tree)، مما يجعله واحدًا من أسرع أطر العمل للغة Go. إنه أسرع بمقدار 2-5 مرات من
net/httpالقياسي. \n - البساطة: واجهة برمجة التطبيقات (API) بديهية، وأقل كود لتشغيل الخادم. \n
- الوسيطة (Middleware): دعم مدمج لسلاسل البرامج الوسيطة (middleware) لتسجيل الدخول، والمصادقة، و CORS، إلخ. \n
- التحقق من الصحة: نظام قوي للتحقق من صحة الطلبات (binding) مع دعم الهياكل. \n
- الأداء: استهلاك منخفض للذاكرة وإنتاجية عالية. \n
- المجتمع: مجتمع ضخم، والعديد من البرامج الوسيطة والإضافات الجاهزة. \n
Gin مثالي لـ: إنشاء RESTful API، والخدمات المصغرة، والواجهة الخلفية لتطبيقات SPA، وخوادم الوكيل، وأي تطبيقات HTTP حيث تكون السرعة مهمة.
\n\nالتثبيت
\n\nيتم تثبيت Gin من خلال مدير الحزم القياسي للغة Go. تأكد من تثبيت Go الإصدار 1.13 أو أعلى.
\n\n# تهيئة الوحدة (إذا لم يتم ذلك بعد)\ngo mod init myapp\n\n# تثبيت Gin\ngo get -u github.com/gin-gonic/gin\n\nبعد تنفيذ الأمر، ستتم إضافة Gin إلى go.mod و go.sum. يمكنك الآن استيراده في الكود الخاص بك:
import "github.com/gin-gonic/gin"\n\nبداية سريعة: أول خادم على Gin
\n\nأنشئ ملفًا باسم main.go واكتب أبسط خادم HTTP:
package main\n\nimport (\n "net/http"\n "github.com/gin-gonic/gin"\n)\n\nfunc main() {\n // إنشاء موجه مع الوسيطة الافتراضية (مسجل + استرداد)\n r := gin.Default()\n\n // تحديد المسار GET /\n r.GET("/", func(c *gin.Context) {\n c.JSON(http.StatusOK, gin.H{\n "message": "Hello, Gin!",\n })\n })\n\n // تشغيل الخادم على المنفذ 8080\n r.Run(":8080")\n}\n\nقم بتشغيل التطبيق:
\n\ngo run main.go\n\nالآن افتح المتصفح وانتقل إلى http://localhost:8080/. سترى استجابة JSON: {"message":"Hello, Gin!"}.
الطرق والوظائف الأساسية في Gin
\n\nفيما يلي 10 طرق ووظائف رئيسية في Gin مع شرح مفصل وأمثلة.
\n\n1. gin.Default()
\nما يفعله: ينشئ مثيلاً جديدًا لموجه Gin مع وسيطتين مدمجتين: Logger (تسجيل الطلبات) و Recovery (الاسترداد بعد الذعر).
\nالمعلمات: لا يوجد.
\nمثال:
\nr := gin.Default()\n\n2. r.GET() / r.POST() / r.PUT() / r.DELETE()
\nما يفعله: يحدد معالجًا لطريقة HTTP والمسار المقابل.
\nالمعلمات:
\n- \n
relativePath(string) — مسار التوجيه (مثل "/users/:id") \nhandlers(...HandlerFunc) — دالة معالج واحدة أو أكثر \n
مثال:
\nr.GET("/users", func(c *gin.Context) {\n c.JSON(200, gin.H{"users": []string{"Alice", "Bob"}})\n})\n\nr.POST("/users", func(c *gin.Context) {\n // إنشاء مستخدم\n c.JSON(201, gin.H{"status": "created"})\n})\n\n3. c.JSON()
\nما يفعله: يرسل استجابة JSON إلى العميل مع رمز حالة HTTP محدد.
\nالمعلمات:
\n- \n
code(int) — رمز حالة HTTP (على سبيل المثا