طرق الاتصال على قيود الاتحاد في Go Generics
في Go Generics (الإصدار 1.18)، يمكنك مواجهة قيد اتحاد النوع الذي يحد نوع المعلمة للأنواع التي تطبق واجهة موحدة. ومع ذلك، فإن عدم القدرة على استدعاء الأساليب المشتركة بين الأنواع المقيدة يثير مخاوف بشأن فائدة هذه القيود.
خذ بعين الاعتبار الكود التالي:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool { return true } func (b *B) some() bool { return false } func some[T AB](x T) bool { return x.some() } // Compiler error
خطأ المترجم "x.some غير محدد" يرجع إلى حقيقة أن قيد اتحاد النوع *A | *B لا يضمن وجود بعض الأساليب على كل من *A و *B.
لحل هذه المشكلة، يمكنك إضافة الأسلوب إلى قيد الواجهة:
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
هذا يقيد T على الأنواع التي تنفذ كلاً من *A أو *B وتعلن عن الطريقة some.
ومع ذلك، يُنظر إلى هذا الحل كحل بديل لما يجب أن يعمل بشكل مثالي مع اتحادات الكتابة وحدها. يحتوي Go 1.18 حاليًا على قيود حيث يدعم المترجم استدعاء طريقة على قيمة معلمة النوع P فقط إذا تم الإعلان عن الطريقة m بشكل صريح بواسطة واجهة القيد P. على الرغم من أن مواصفات اللغة تنص على أن مجموعة الأساليب الخاصة بالواجهة هي تقاطع مجموعات الأساليب لكل نوع في مجموعة أنواع الواجهة. ومن المتوقع أن تتم معالجة هذه المشكلة في Go 1.19.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3