لغة البرمجة GO الجزء الرابع – حلقات التكرار

الحلقات التكرارية تفيد في تكرار تنفيذ مجموعة من التعليمات دون الحاجة لإعادة كتابتها . وهذا من المفاهيم الأساسية في عالم البرمجة.

وهنا في لغة البرمجة GO لدينا مجموعة طرق لتنفيذ الحلقات التكرارية بالاعتماد على الحلقة For و سنتعرف عليها بشكل مفصل.

– حلقة التكرار For

هي أبسط حلقة تكرار من حيث المفهوم. حيث تقوم بتكرار مجموعة من التعليمات التابعة لها طالما الشرط الخاص بالحلقة محقق.

ويمكن تعريف كيفية كتابة هذه الحلقة بالشكل التالي :

for initialization; condition; modify{
   // code
}
  • تبدأ الحلقة بالكلمة for . ثم يليها مباشرة تعليمة التهيئة initialization وبعدها فاصلة منقوطة
  • ثم شرط استمرار تنفيذ الحلقة condition
  • ثم تعليمة التعديل modify التي يتم تنفيذها بعد كل دورة من دورات التنفيذ للحلقة
  • أما التعليمات التابعة للحلقة والتي سيتم تكرارها فهي الموجودة بين القوسين المنحنيين

لنأخذ المثال التالي لتوضيح الفكرة:

package main
import ("fmt")

func main() {
  for i:=0; i < 5; i++ {
    fmt.Println(i)
  }
}

كما نرى ضمن التابع الرئيسي main قمنا بتعريف الحلقة for كما يلي:
– في البداية عرفنا المتحول i ووضعنا فيه القيمة البدائية 0.
– ثم كتبنا شرط استمرار الحلقة وهو أن تكون قيمة i أصغر من 5
– ثم تعليمة التعديل البسيطة i++ التي تزيد قيمة i بعد كل عملية تنفيذ لتعليمات الحلقة
– أما العمليات التي نريد من هذه الحلقة أن تكررها, فهي فقط تعليمة واحدة. وهي تعليمة طباعة قيمة المتحول i على الشاشة.

لنرى نتيجة تنفيذ هذا البرنامج :

0
1
2
3
4
التعليمة continue 

تفيد التعليمة continue  في الحلقة for بالانتقال إلى الدورة التالية من الحلقة بدون متابعة تنفيذ التعليمات التي تليها ضمن الحلقة.

لنأخذ المثال التالي وهو عملية طباعة جميع الأرقام من 0 إلى 5 ماعدا الرقم 2

for i:=0; i < 5; i++ {
	if i == 2 {
		continue
	}
	
	fmt.Println(i)
  }

قمنا هنا باستخدام نفس المثال السابق مع تعديل بسيط. حيث كتبنا تعليمة شرط if وهي ما سنتعلمه لاحقاً.
وهذا الشرط يتحقق من أن i تساوي 2 , فإذا تحقق الشرط يتم تنفيذ التعليمة continue  والانتقال للدورة التالية بدون تنفيذ أمر الطباعة.

أما إذا لم يتحقق الشرط. عندها ينتقل التفيذ للتعليمة التالية وهي أمر طباعة قيمة المتحول i
وتكون نتيجة التنفيذ هي طباعة الارقام التالية على الشاشة:

0
1
3
4
التعليمة break 

هذه التعليمة تشبه التعليمة continue  لكن هنا لايتم الانتقال للدورة التالية, وإنما ينتهي تنفيذ الحلقة for بالكامل.

لنأخذ المثال السابق , حيث نستمر بطباعة المتحول i طالما أنه لا يساوي 3 مثلا.

for i:=0; i < 5; i++ {
    if i == 3 {
      break
    }
   fmt.Println(i)
  } 

تبدأ الحلقة بقية i تساوي الصفر. وفي كل دورة يتم طباعة قيمة i .
حتى تصبح قيمة i تساوي 3 عندها يتم تنفيذ التعليمة break . وينتهي تنفيذ الحلقة بالكامل.

والنتيجة تظهر على الشاشة كما يلي:

0
1
2
التكرار و المصفوفات

سابقاً كنا نستخدم متحول مثل i نحدد له قيمة أولية , ثم نكرر الحلقة حتى يتحقق شرط يتعلق بقيمة هذا المتحول.
يمكن استخدام نفس العملية عند التعامل مع المصفوفات. لكن في لغة البرمجة GO لدينا ميزة تكرار الحلقة من أجل كل عنصر من عناصر المصفوفة.
وهذا ما يسمى التكرار بالعتماد على الكلمة range . ويمكن توضيحه بالمثال التالي:

var fruits = [3]string{"apple", "orange", "banana"}

for  index, val := range fruits {
     fmt.Println(index, val)
}

هنا قمنا بتعريف مصفوفة اسمها fruits , وتتكون من ثلاث عناصر كما هو موضح في البرنامج.
ثم تبدأ حلقة for بحيث نكتب في البداية المتحول index وهو متحول يحتوي رقم يدل على ترتيب العنصر الحالي ضمن المصفوفة.
وبعده نضع فاصلة ثم المتحول val والذي يحتوي قيمة العنصر الحالي من المصفوفة ذو الترتيب index

بعدها نكتب تعليمة الاسناد ويليها كلمة range ثم اسم المصفوفة والذي هو في حالتنا هنا fruits

ما سيجري هو انه من أجل كل عنصر من عناصر المصفوفة يتم تهيئة قيم المتحولات index و val قبل تنفيذ تعليمات الحلقة.
مثلا عند أول دورة تكون قيمة index هي 0 لأنه ترتيب أول عنصر في المصفوفة.
وتكون قيمة val هي apple لأنها قيمة أول عنصر في المصفوفة. وهكذا.

وفي النهاية تكون نتيجة تنفيذ الحلقة هي طباعة ما يلي على الشاشة:

0 apple
1 orange
2 banana

في حال كنا لانحتاج قيمة المتحول index لايمكن كتابته وتجاهله في لغة البرمجة GO. حيث تعريف المتحولات وعدم استخدامها غير مسموح.
هنا نستعين بالمتحول الخاص _ لقرائة قيمة index واهمالها. كما في الشكل التالي:

var fruits = [3]string{"apple", "orange", "banana"}

for  _, val := range fruits {
     fmt.Println(val)
}

وتكون نتيجة التنفيذ كما يلي:

apple
orange
banana
الحلقة while

عملياً إن لغة البرمجة GO لا تتضمن التعليمة while. والتي هي عبارة عن حلقة تكرار في الحالات التي لانعرف عدد المرات التي سيتم تنفيذ تعليماتها.
لكن يمكن تنفيذ مبدأ حلقة التكرار while من خلال الحلقة for نفسها . وذلك بإهمال تعليمة التهيئة وكذلك تعليمة التعديل. والاكتفاء فقط بتعليمة الشرط كما في المثال:

x := 1
max := 10
	 
for x < max {
    fmt.Println(x)
    x += 2
}

هنا قمنا بتعريف متحولين. الأول x وقيمته 1
والثاني max وقيمته 10

ثم كتبنا حلقة for بحيث تبدأ فقط بتعليمة الشرط. وهنا شرط استمرار الحلقة هو أن تكون x أصغر من max

أما التعليمات التي تقوم الحلقة بتنفيذها فهي طباعة قيمة المتحول x , ومن ثم زيادة قيمته بمقدار 2 .

ونتيجة التنفيذ هي طباعة ما يلي على الشاشة:

1
3
5
7
9

هذا كان أهم النقاط التي نحتاج معرفتها عن الحلقات في لغة البرمجة GO .