أصبحت لغة Golang، أو Go فقط، تُعرف باسم لغة Go gopher. إذا كنت لا تزال لا تفهم سبب وجود الغوفر، فيمكنك العثور على تاريخ التميمة المدهش في هذه المقالة. حسنًا، لنبدأ من البداية، لقد أصبحت لغة Golang معروفة كواحدة من أكثر لغات البرمجة إنتاجية على الإطلاق. على عكس اللغات التقليدية مثل Java أو Python، يحقق Go توازنًا فريدًا بين التعليمات البرمجية سهلة الكتابة والتنفيذ السريع، وتسريع التطوير وتقليل وقت تصحيح الأخطاء والاختبار. ستتناول هذه المقالة مثالًا حقيقيًا لاستخدام goroutines والسياق في مشروع يتفاعل مع خدمة REST API الصغيرة البطيئة وغير المستقرة.
المهمة
لنتخيل أنك انضممت للتو إلى الفريق ويطلب منك قائد فريقك ربط خدمة صغيرة جديدة مكتوبة بلغة Golang (على سبيل المثال، مدير المخاطر) بالخدمة الصغيرة للمستخدم المكشوفة من خلال REST API.
المشكلة
يحتاج مدير المخاطر إلى التفاعل مع REST API التي يمكن أن تكون بطيئة وغير مستقرة، مما يتطلب منا التعامل مع مثل هذه الطلبات بعناية. سأستخدم goroutines لطلبات HTTP غير المتزامنة والسياق لإدارة مهلات الطلب ومعالجة الأخطاء.
الحل
يتيح استخدام goroutines والسياق في Golang الإدارة الفعالة للمهام المتزامنة والتعامل مع واجهات برمجة التطبيقات الخارجية البطيئة أو غير المستقرة.
الخطوة الأولى لتفسيرها في الكود هي إنشاء واجهة برمجة التطبيقات (API)، لقد استخدمت خدمة البرامج التجريبية https://mockapi.io/ من الملائم إنشاء REST واجهة برمجة التطبيقات (API) مع مجموعة أساسية من الكيانات، مثل المستخدمين.
لنفترض أن شخصًا ما بذل قصارى جهده وأن شركتك لديها خدمة داخلية تسرد المستخدمين. مهمتنا هي إعادة استخدام قائمة المستخدمين في مدير المخاطر الجديد (بنية بيانات المستخدم تفي بالعقد الموضح في mockapi.io). الكود أدناه يقدم طلبًا ويعالج النص وينتج إما قائمة بالمستخدمين أو الخطأ المقابل.
type User struct { CreatedAt string Name string Avatar string Id string } // Original slow request func fetchUsers(ctx context.Context) (*[]User, error) { resp, err := http.Get("https://
للتحكم في العملية، سأستخدم السياق الأصلي الأعلى لجميع السياقات الأخرى - context.Background. سأكمل هذا السياق ببيانات جديدة، في هذه الحالة المهلة - context.WithTimeout، والتي سأحددها بثانيتين. يمكنك قراءة المزيد حول التعامل مع السياقات في Go في هذه المقالة.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() usersChan := make(chan *[]User) errChan := make(chan error) go func() { users, err := fetchUsers(ctx) if err != nil { errChanفي المثال، أستخدم قناتين - usersChan لتسجيل النتيجة المستلمة من خدمتنا الداخلية، والقناة الثانية errChan - لتسجيل الخطأ.
إذا لم تصل الاستجابة من واجهة برمجة التطبيقات البطيئة خلال ثانيتين، فإننا نكتشف خطأ ونمنح الفرصة لمعالجته بشكل صحيح على طبقة خارجية.في هذا المثال العملي مع مدير المخاطر، قامت goroutines بتمكين طلبات HTTP غير المتزامنة، بينما يضمن السياق معالجة المهلة، وهو أمر بالغ الأهمية لبناء خدمات صغيرة موثوقة ومرنة.
ملاحظة.
هذه المقالة مخصصة للمطورين المبتدئين الذين لديهم المعرفة الأساسية، ولكن لديهم فكرة قليلة عن المكان الذي يمكنهم فيه تطبيق معرفتهم. سأكون سعيدًا بتلقي تعليقاتك وسأكون سعيدًا بالإجابة على أسئلتك.
يمكن العثور على مثال عملي والعديد من التطبيقات الأخرى للأشياء الأساسية في لغة Go على GitHub الخاص بي، على الرابط
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3