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

كيف يمكننا تقييد الأنواع القابلة للفهرسة بشكل فعال في Go 1.18 Generics؟

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

How Can We Effectively Constrain Indexable Types in Go 1.18 Generics?

قيود الفهرسة في Go 1.18 Generics

مع تقديم الأدوية العامة في Go 1.18، يتمتع المطورون بفرصة تنفيذ الخوارزميات التي تعمل مع محددات أنواع. أحد المتطلبات الشائعة هو استخدام الأنواع التي تدعم الفهرسة، مثل المصفوفات والشرائح والخرائط والسلاسل.

قيد قابل للفهرسة

لتقييد معلمة النوع إلى الأنواع القابلة للفهرسة ، ضع في اعتبارك استخدام القيد التالي مع الاتحاد:

type Indexable interface {
    ~[]byte | ~string
}

قيود القيد القابل للفهرسة

بينما يعمل القيد أعلاه لفهرسة البايتات والسلاسل، هناك قيود على استخدامه مع أنواع أخرى قابلة للفهرسة، مثل الخرائط والمصفوفات :

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

بسبب هذه القيود، فإن الاتحاد العملي الوحيد الذي يدعم الفهرسة هو []بايت | خيط. يسمح هذا الاتحاد بعمليات الفهرسة ولكنه لا يدعم عمليات النطاق لأنه يفتقر إلى نوع أساسي.

مثال للاستخدام

يوضح المثال التالي كيفية استخدام القيد القابل للفهرسة:

func GetAt [T Indexable] (v T، i int) byte { العودة الخامس[i]
func GetAt[T Indexable](v T, i int) byte {
    return v[i]
}

الاستنتاج

بينما يوفر Go 1.18 طريقة لتقييد الأنواع بأنواع قابلة للفهرسة باستخدام اتحاد، فإن قيود هذا القيد تعني أنه عملي فقط لمجموعة محدودة من حالات الاستخدام، وهي فهرسة البايتات والسلاسل.

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

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

Copyright© 2022 湘ICP备2022001581号-3