تزامن الواجهة/التنفيذ في 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