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

**كيفية الحفاظ على العلاقات بين الواجهة والمنفذ عند استخدام الأدوية العامة في Go لتهيئة الشريحة؟**

تم النشر بتاريخ 2024-11-05
تصفح:330

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

تزامن الواجهة/التنفيذ في Golang Generics

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

في Go 1.18، يؤدي تقييد كل من X وY كأي نوع داخل الوظيفة العامة fill إلى خسارة من أي علاقة بين الواجهة ومنفذيها. يمنع هذا تعيين مثيلات Y إلى شريحة [i] داخل الوظيفة.

للتغلب على هذا، يمكن استخدام تأكيد صريح:

func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}

ومع ذلك، فإن هذا النهج يزعج عندما لا يطبق Y X. بالإضافة إلى ذلك، يؤدي استخدام نوع المؤشر لـ Y إلى فقدان معلومات حول النوع الأساسي وقيمة خط الأساس صفر.

إلى لمعالجة هذه المشكلات، يوصى باستخدام دالة منشئة بدلاً من معلمة النوع الثاني:

func main() {
    xs := make([]sync.Locker, 10)
    Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}

func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}

يملأ هذا الأسلوب الشريحة بشكل فعال بالقيم المبدئية التي تم إنشاؤها بواسطة وظيفة المنشئ، مما يوفر حلاً أكثر قوة ومرونة للمشكلة.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3