"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف سيحل Golang مهمة العمل الأولى الخاصة بك

كيف سيحل Golang مهمة العمل الأولى الخاصة بك

تم النشر بتاريخ 2024-07-31
تصفح:778

أصبحت لغة 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) مع مجموعة أساسية من الكيانات، مثل المستخدمين.

Image description

لنفترض أن شخصًا ما بذل قصارى جهده وأن شركتك لديها خدمة داخلية تسرد المستخدمين. مهمتنا هي إعادة استخدام قائمة المستخدمين في مدير المخاطر الجديد (بنية بيانات المستخدم تفي بالعقد الموضح في 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://.mockapi.io/api/v1/users")
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("failed to fetch users: %s", resp.Status)
    }

    var users []User
    if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
        return nil, err
    }

    return &users, nil
}

للتحكم في العملية، سأستخدم السياق الأصلي الأعلى لجميع السياقات الأخرى - 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 الخاص بي، على الرابط

بيان الافراج هذه المقالة مستنسخة على: https://dev.to/maxflower/how-golang-will-solve-your-first-working-task-3kpc?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3