1 نظرة عامة على عبارات الحلقة

في لغة Go، تسمح عبارات الحلقة لنا بتنفيذ كتلة تعليمات عدة مرات. عندما تحتاج إلى تنفيذ عمليات معينة بشكل متكرر، تصبح عبارات الحلقة مفيدة للغاية. على سبيل المثال، قد ترغب في تكرار التنقل من خلال كل عنصر في مصفوفة، أو تكرار عملية ما حتى يتم تحقيق شرط معين. في Go، تُنفذ عبارات الحلقة بشكل أساسي باستخدام كلمة for، وهي العبارة الوحيدة في لغة Go التي تُستخدم لعبارات الحلقة. الاستخدام الصحيح لعبارات الحلقة أمر بالغ الأهمية لكتابة الشيفرات الفعّالة والقابلة للصيانة.

2 أساسيات عبارة الحلقة for

2.1 بنية عبارة الحلقة for

تتكون عبارة الحلقة for في لغة Go من ثلاثة أجزاء:

  1. البيان المبدئي: يُنفَّذ قبل التكرار الأول، وعادةً ما يُستخدم لتعريف عداد الحلقة.
  2. تعبير الشرط: يُقَوَّم قبل كل تكرار. إذا كان الشرط صحيح، يتم تنفيذ جسم الحلقة.
  3. البيان اللاحق: يُنفَّذ بعد كتلة الكود في كل تكرار، وعادةً ما يُستخدم لتحديث عداد الحلقة.

نص بنية عبارة الحلقة for هو كما يلي:

for البيان المبدئي; تعبير الشرط; البيان اللاحق {
    // كود جسم الحلقة
}

2.2 مثال بسيط لعبارة الحلقة for

لنفهم عملية تنفيذ عبارة الحلقة for من خلال مثال بسيط:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("قيمة i هي:", i)
    }
}

في هذا المثال، يتم تهيئة المتغير i إلى 0. تتحقق عبارة for مما إذا كان الشرط i < 5 صحيحًا. إذا كان الشرط صحيحًا، يتم تنفيذ جسم الحلقة ويتم طباعة قيمة i. بعد تنفيذ جسم الحلقة، يتم تحديث قيمة i بواسطة i++ (عملية زيادة)، ثم يُعيد الحلقة التحقق من الشرط حتى تصل قيمة i إلى 5، حيث يصبح الشرط غير صحيح وتتوقف عبارة for عن التنفيذ.

2.3 أمثلة أخرى لعبارة الحلقة for

2.3.1 الحلقة اللانهائية

في Go، يمكنك حذف البيان المبدئي وتعبير الشرط والبيان اللاحق من عبارة الحلقة for، مما يخلق حلقة لانهائية ستعمل حتى يتم إنهاؤها بيان break أو قيمة إرجاع من دالة.

for {
    // كود داخل حلقة لانهائية
    إذا تحققت بعض الشرط {
        break // الخروج من الحلقة عند تحقق شرط معين
    }
}

2.3.2 الحلقة مع شرط واحد فقط

في Go، يمكنك أيضًا استخدام عبارة for التي تحتوي فقط على شرط واحد، على غرار حلقة while في لغات البرمجة الأخرى.

n := 0
for n < 5 {
    fmt.Println(n)
    n++
}

سيقوم الكود أعلاه بطباعة 0 إلى 4، وسينتهي الحلقة عندما يصل n إلى 5.

2.3.3 تكرار عبر مصفوفة أو شريحة

في Go، يُستخدم الكلمة المفتاحية range لتبسيط التكرار عبر كل عنصر في مصفوفة أو شريحة.

items := []int{1, 2, 3, 4, 5}
for index, value := range items {
    fmt.Printf("الفهرس: %d، القيمة: %d\n", index, value)
}

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

for _, value := range items {
    fmt.Printf("القيمة: %d\n", value)
}

ملاحظة: سيتم شرح استخدام المصفوفات بالتفصيل في الفصول اللاحقة. إذا لم تفهم هذا الجزء، فلا بأس طالما فهمت أن عبارة الحلقة for يُمكن استخدامها بهذه الطريقة.

2.3.4 تكرار الخرائط

عند تكرار خريطة، يكون توافق حلقة for وتعبير range قويًا جدًا. يتيح لك هذا الجمع الحصول على كل زوج مفتاح-قيمة من الخريطة.

colors := map[string]string{"red": "#ff000", "green": "#00ff00", "blue": "#000ff"}
for key, value := range colors {
    fmt.Printf("المفتاح: %s، القيمة: %s\n", key, value)
}

في هذا المثال، نطبع كل المفاتيح وقيمهم المقابلة في الخريطة colors. بالمثل لتكرار الشرائح، إذا كنت بحاجة فقط إلى المفتاح أو القيمة، يمكنك تجاهل الآخر.

ملاحظة: سيتم شرح استخدام الخرائط بتفصيل في الفصول التالية. إذا لم تفهم هذا الجزء، فلا بأس طالما فهمت أن حلقة for يمكن استخدامها بهذه الطريقة.

3 التحكم في تدفق الحلقات

3.1 استخدام break لإنهاء الحلقة

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

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // الخروج من الحلقة عندما يكون i يساوي 5
        }
        fmt.Println("قيمة i هي:", i)
    }
    // ستحتوي النتيجة فقط على القيم من 0 إلى 4
}

3.2 استخدام continue لتخطي التكرارات

في بعض الحالات، قد نرغب في تخطي التكرار الحالي والمتابعة مع التكرار التالي في الحلقة. يمكن تحقيق ذلك باستخدام بيان continue. إليك مثالًا:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i%2 != 0 {
            continue // تخطي هذا التكرار إذا كان i فرديًا
        }
        fmt.Println("رقم زوجي:", i)
    }
}