iter.Seq2
تكرار بأزواج قيم (مفتاح وقيمة) iter.Seq2
iter.Seq2[K, V] نفس فكرة iter.Seq لكن بزوج قيم لكل خطوة — الصيغة التي تستخدمها maps.All وslices.All لإرجاع مفتاح أو فهرس مع القيمة معًا.
iter.Seq2[K, V] دالة بتوقيع func(yield func(K, V) bool) — نفس فكرة Seq تمامًا لكن yield يستقبل قيمتين لكل خطوة بدل واحدة. حزمة maps تستخدمها في All(m) لتحويل خريطة عادية لتكرار كسول بزوج مفتاح/قيمة، وحزمة slices تستخدمها في All(s) لإرجاع فهرس وقيمة معًا.
ميزتها الأساسية أنها قابلة للّف: يمكن كتابة دالة توليد جديدة تأخذ iter.Seq2 موجودًا (مثل maps.All) وتصفّي أو تحوّل قيمه قبل تمريره لـ range، دون تخصيص خريطة أو شريحة وسيطة كاملة أولًا.
الصياغة
type Seq2[K, V any] func(yield func(K, V) bool)
📄 مثال
func OnlyAdults(m map[string]int) iter.Seq2[string, int] {
return func(yield func(string, int) bool) {
for name, age := range maps.All(m) {
if age >= 18 {
if !yield(name, age) {
return
}
}
}
}
}
for name, age := range OnlyAdults(ages) {
fmt.Println(name, age)
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| func(yield func(K, V) bool) | توقيع دالة Seq2 — تستدعي yield لكل زوج مفتاح/قيمة |
| maps.All(m) | يحوّل خريطة عادية لـ iter.Seq2[K, V] قابل للّف بدوال أخرى قبل المرور عليه |
| slices.All(s) | يعيد iter.Seq2[int, E] للشريحة — فهرس وقيمة معًا، قابل للتمرير كقيمة لدالة أخرى بعكس range المباشر |
💡 نصائح عملية
- لفّ تكرارًا موجودًا (مثل maps.All) بدالة توليد جديدة لتصفية أو تحويل القيم قبل المرور عليها فعليًا، دون تخصيص بنية وسيطة
- استخدم maps.Collect لتجميع نتيجة Seq2 بخريطة جديدة إن احتجت النتيجة كقيمة مخزَّنة لا مرورًا مباشرًا
⚠️ أخطاء شائعة
- الاعتقاد أن iter.Seq2 يضمن ترتيبًا ثابتًا عند لفّ خريطة — الترتيب يبقى غير مضمون تمامًا كـ range العادي على map
- الخلط بين "type X = Y" (أليس) و"type X Y" (نوع جديد) عند تعريف دالة تعيد Seq2 بنوع مسمّى مخصّص
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.