دروس الوحدة (3/5)
ل... المدى
for ... range هي الطريقة الاصطلاحية للتكرار على المجموعات:
الشرائح والمصفوفات والخرائط والسلاسل والقنوات. يتغير بناء الجملة قليلا
اعتمادًا على المجموعة، لكن النمط الأساسي هو نفسه دائمًا:
محمي_INLINE_5.
تتراوح على شرائح ومصفوفات
إرجاع الفهرس و نسخة من القيمة:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30في كثير من الأحيان يكون أحد الأمرين كافيا:
// solo indice
for i := range nums { _ = i }
// solo valore (ignora indice con _)
for _, v := range nums { _ = v }نطاق على الخريطة
إرجاع المفتاح و القيمة:
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
fmt.Println(k, v)
}النطاق على سلسلة: الأحرف الرونية، وليس البايتات
for i, r := range s يتم التكرار لكل نقطة رمز Unicode (رون)، وليس لكل
بايت. الفهرس i هو إزاحة البايت لبداية الرون.
for i, r := range "èé" {
fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)للتكرار لكل بايت، استخدم الفهرسة الكلاسيكية:
s := "ciao"
for i := 0; i < len(s); i++ {
fmt.Println(s[i]) // byte (uint8)
}النطاق على القناة
يتكرر حتى يتم إغلاق القناة:
ch := make(chan int)
go func() {
for i := 0; i < 3; i++ { ch <- i }
close(ch)
}()
for v := range ch {
fmt.Println(v)
}سوف نتعمق أكثر في وحدة التزامن.
جربه
اطبع فهرس وقيمة كل عنصر من الأعداد باستخدام for-range.
الحل متاح بعد 3 من المحاولات
اجمع إجمالي جميع قيم الأعداد متجاهلاً الفهرس.
إظهار التلميح
استخدم `_` لتجاهل الفهرس.
الحل متاح بعد 3 من المحاولات
ماذا يمثل المتغير الأول في `for k, v := range m` عندما تكون m خريطة؟
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }خلاصة
for k, v := range collبنطاق واضح: تجاهل باستخدام_ما لا تستخدمه.- الشريحة/المصفوفة: فهرس + نسخة من القيمة. للتحول، مؤشر.
- الخريطة: مفتاح + قيمة، ترتيب عشوائي في كل جولة.
- السلسلة: يتكرر النطاق لكل رونية (نقطة الكود)، وليس لكل بايت.
- القناة: تتكرر عندما تكون القناة مفتوحة؛ مغلق بـ
close().