slices.Collect
تجميع تكرار داخل شريحة جديدة slices.Collect
slices.Collect يأخذ iter.Seq[V] ويجمع كل القيم الناتجة عنه داخل شريحة []V جديدة — الجسر بين عالم التكرارات الكسولة والشرائح العادية.
لما تحتاج نتيجة تكرار (iterator) كشريحة عادية مخزَّنة، لا مجرّد المرور عليها مرّة واحدة، slices.Collect يستهلك iter.Seq[V] بالكامل ويعيد []V جديدة. الحزمة maps استفادت من هذا التغيير أيضًا: maps.Keys وmaps.Values تعيدان الآن iter.Seq بدل شريحة جاهزة كما كان بنسخ أقدم من خارج stdlib، فيحتاج من يريد شريحة فعلية استدعاء Collect صراحة.
هذا يفتح استخدامًا عمليًا مباشرًا: ترتيب ثابت للمرور على خريطة، وهو ما كان يحتاج سابقًا استخراج المفاتيح يدويًا ثم فرزها.
الصياغة
func Collect[E any](seq iter.Seq[E]) []E
📄 مثال
ages := map[string]int{"سارة": 22, "براء": 25, "علي": 30}
names := slices.Collect(maps.Keys(ages)) // شريحة بلا ترتيب مضمون
fmt.Println(len(names)) // 3أهم النقاط
| العنصر | الوظيفة |
|---|---|
| slices.Collect(seq) | يجمع أي iter.Seq[V] داخل []V جديدة، بلا فرز |
| maps.Keys(m) | يعيد الآن iter.Seq[K] (منذ Go 1.23) بدل شريحة جاهزة كإصدارات أقدم |
💡 نصائح عملية
- لو تحتاج ترتيبًا ثابتًا لمفاتيح خريطة استخدم slices.Sorted(maps.Keys(m)) مباشرة بدل Collect متبوعًا بفرز يدوي
- لا تستدعِ Collect إلا لو تحتاج فعلًا النتيجة كشريحة مخزَّنة — لو كل ما تريده مرور واحد فـ range مباشرة على iterator نفسه أوفر
⚠️ أخطاء شائعة
- استدعاء slices.Collect على تكرار لا ينتهي منطقيًا (تسلسل لانهائي) — يعلّق البرنامج لأنه يحاول تجميع كل القيم قبل الإرجاع
- توقّع أن Collect تفرز الناتج — لا تفعل، استخدم slices.Sorted لو تحتاج فرزًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.