Go Academy · درس

التعميمات عمليًا: المشكلات

متى تستخدم التعميمات والأخطاء الشائعة

الدرس 4 من 413 خطوة

التعميمات عمليًا: المشكلات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

الإفراط في استخدام الأنواع العامة

لا تحتاج كل دالة إلى أن تكون عامة. إذا لم يُستخدم سوى نوع ملموس واحد، فسيضيف النوع العام تعقيدًا دون فائدة. فضّل الأنواع الملموسة، ثم أعد الهيكلة إلى أنواع عامة عند ظهور التكرار.

تأكيد النوع داخل الأنواع العامة

لا يمكنك استخدام تأكيد النوع أو type switch داخل دالة عامة على معلمة النوع نفسها؛ فالأنواع العامة ليست قوالب. استخدم الواجهات أو حزمة reflect بدلًا من ذلك.

// WRONG:
func Foo[T any](v T) {
    if x, ok := v.(int); ok { // compile error
    }
}

Comparable لا يعني Ordered

يدعم comparable العامل == فقط. ولاستخدام < و>، تحتاج إلى cmp.Ordered أو قيد مخصص. ومن الأخطاء الشائعة افتراض أن comparable يشمل الترتيب.

لا يمكن للأسلوب إضافة معلمات أنواع

تعيد الأساليب في الأنواع العامة استخدام معلمات النوع الخاصة بالنوع، لكنها لا تستطيع إضافة معلمات جديدة. إذا احتاج الأسلوب إلى معلمة نوع إضافية، فاستخدم دالة على مستوى الحزمة بدلًا من ذلك.

// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile error

القيم nil والقيم الصفرية

بالنسبة إلى معلمات أنواع المؤشرات، تكون القيمة الصفرية هي nil. أما بالنسبة إلى أنواع القيم، فهي القيمة الصفرية لذلك النوع. تعامل دائمًا مع الحالة الصفرية بدلًا من افتراض أن القيمة ليست nil.

مجموعات أساليب الواجهات والأنواع العامة

لا يمكن لدالة عامة مقيّدة بواجهة استدعاء سوى الأساليب المعلنة في تلك الواجهة. وإضافة أساليب إلى نوع ملموس لا تجعلها متاحة من خلال القيد.

تضخم إنشاء المثيلات (GC shapes)

تشارك Go التنفيذات بين الأنواع التي لها شكل GC نفسه؛ فعلى سبيل المثال، تشترك جميع أنواع المؤشرات في تنفيذ واحد. وتحصل الأنواع البدائية على تنفيذ خاص بكل منها، لكن نهج Go يحافظ على أحجام ثنائية معقولة.

Any ليست interface{}

any اسم مستعار لـ interface{}، لكن الدالة العامة F[T any] ليست مثل F(v interface{})؛ ففي الدالة العامة يكون T هو النوع الملموس عند موضع الاستدعاء، مما يحافظ على معلومات النوع.

الأنواع العامة递ursive

لا تدعم Go تعريفات معلمات الأنواع递ursive مثل type Tree[T Tree[T]]. استخدم التركيب بدلًا من ذلك:

type TreeNode[T any] struct {
    Val   T
    Left  *TreeNode[T]
    Right *TreeNode[T]
}

المساعدات ذات المثيلات المنشأة مسبقًا

في الكود الحساس للأداء، أنشئ مسبقًا مثيلات للدوال العامة المستخدمة بكثرة باعتبارها دوالًا على مستوى الحزمة لتجنب التكلفة المتكررة لاستنتاج الأنواع، مع أن مصرّف Go يتعامل مع ذلك بكفاءة.

اختبار الكود العام

اختبر الدوال العامة باستخدام مثيلات متعددة: مثيلًا لكل قيد مميز، مثل int وstring ونوع مخصص. يكشف ذلك الحالات الطرفية الخاصة بكل قيد.

func TestMap(t *testing.T) {
    got := Map([]int{1,2}, double)
    // test with strings too
    gotS := Map([]string{"a","b"}, strings.ToUpper)
}

تحقق سريع

لماذا لا يمكنك استخدام type switch على معلمة النوع العامة T داخل دالة عامة؟

مراجعة: مشكلات الأنواع العامة

النقاط الأساسية:

  • لا تفرط في استخدام الأنواع العامة؛ فالأنواع الملموسة أبسط عند استخدامها مرة واحدة
  • لا يمكن استخدام type switch أو تأكيد النوع على T داخل الدوال العامة
  • comparable لا يعني ordered؛ استخدم cmp.Ordered لدعم <
  • لا يمكن للأساليب إضافة معلمات أنواع جديدة
البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «التعميمات عمليًا: المشكلات» مجاني؟

نعم — نص درس «التعميمات عمليًا: المشكلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «التعميمات عمليًا: المشكلات»؟

متى تستخدم التعميمات والأخطاء الشائعة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التعميمات عمليًا: المشكلات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. صياغة معاملات الأنواع
  2. القيود: comparable والواجهات
  3. هياكل البيانات العامة
  4. التعميمات عمليًا: المشكلات
← العودة إلى Go Academy