range
المرور على العناصر range
range يمرّ على عناصر شريحة أو خريطة أو نص أو قناة بصيغة موحّدة، ويعيد قيمتين مختلفتي المعنى حسب النوع.
range تُستخدم مع for للمرور على تجميعة بيانات كاملة دون إدارة فهرس يدويًا. مع الشرائح والمصفوفات تعيد الفهرس والقيمة معًا؛ ومع الخرائط تعيد المفتاح والقيمة (بترتيب غير مضمون بين تكرارات مختلفة)؛ ومع النصوص تمرّ على نقاط الشيفرة (runes) لا البايتات الخام، وتعيد فهرس البايت الأول للحرف مع قيمة الـ rune نفسها — مهم للتعامل الصحيح مع نصوص UTF-8 كالعربية.
يمكن تجاهل أي من القيمتين المُعادتين بالمعرّف الفارغ `_`، أو تجاهل الثانية كليًّا بكتابة for k := range m للمرور على المفاتيح فقط.
الصياغة
for index, value := range collection {
// ...
}
for key := range m {
// المفاتيح فقط
}
for _, value := range slice {
// القيم فقط
}📄 مثال
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v) // 0 10 / 1 20 / 2 30
}
ages := map[string]int{"سارة": 22, "براء": 25}
for name, age := range ages {
fmt.Println(name, age)
}
for i, r := range "عربي" {
fmt.Println(i, string(r)) // فهرس البايت + الحرف نفسه
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| range slice | يعيد الفهرس والقيمة لكل عنصر |
| range map | يعيد المفتاح والقيمة، بترتيب غير ثابت بين التكرارات |
| range string | يمرّ على نقاط الشيفرة (runes)، لا البايتات الخام |
💡 نصائح عملية
- استخدم _ لتجاهل القيمة التي لا تحتاجها بدل تعريف متغيّر لن يُستخدم
- لما تحتاج ترتيبًا ثابتًا من خريطة، استخرج المفاتيح لشريحة ورتّبها بـ sort قبل المرور عليها
⚠️ أخطاء شائعة
- الاعتماد على ترتيب ثابت عند المرور على map — Go لا يضمن نفس الترتيب بين تشغيلتين
- الظن أن range على نص يمرّ حرفًا حرفًا كالبايتات — فعليًا يمرّ على runes، فالفهارس قد تتخطّى أكثر من رقم مع الأحرف متعددة البايت
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.