جولانج لحلقة البرنامج التعليمي [With Examples]

تعلم كل شيء عن Golang for loops من خلال ترميز العديد من الأمثلة المفيدة.

أصبحت لغات البرمجة مؤخرًا مثل Rust و Golang و TypeScript شائعة جدًا بين المطورين. إذا كنت مهتمًا بالتطوير الخلفي و DevOps ، فيجب أن تفكر في تعلم أن Golang خيار ممتاز!

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

يوفر Golang فقط بنية الحلقة for. وسنتعرف على الحلقات for وكيفية محاكاة الحلقات الأخرى باستخدام الحلقة for.

هيا نبدأ!

بناء جملة Golang For Loop

في Golang ، يمكنك إنشاء حلقة for باستخدام الصيغة التالية:

for initialization; condition; update {
    // do something
}

هنا،

  • يشير التهيئة إلى تهيئة متغير التكرار.
  • الشرط هو شرط التكرار الذي يحدد تنفيذ جسم الحلقة. طالما يتم تقييم شرط التكرار إلى صحيح ، يتم تنفيذ العبارات الموجودة في جسم الحلقة. وعندما يصبح الشرط خاطئًا ، يخرج عنصر التحكم من الحلقة.
  • التحديث يشير إلى تحديث المتغير الحلقي – عادة زيادة أو إنقاص.

💡 لاحظ كيف أن هذا مشابه لحلقة C for فقط بدون الأقواس.

إليك تدفق التحكم في Golang for loops:

حان الوقت لترميز بعض الأمثلة! للترميز ، يمكنك إما استخدام التثبيت المحلي لـ Golang أو تشغيل الأمثلة على Go Playground.

Golang للحصول على أمثلة الحلقة

لنستخدم الصيغة التي تعلمناها للتو لكتابة حلقة for الأولى. فيما يلي حلقة for بسيطة تطبع الأرقام من 1 إلى 5 في خطوات واحدة.

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		fmt.Println(i)
	}
}

نقوم بتهيئة متغير التكرار i إلى 1 ، ونضبط الشرط على i <= 5 ، ونزيد متغير التكرار بمقدار واحد بعد كل تكرار. وإليك النتيجة:

//Output
For loop:
1
2
3
4
5

دعنا نكتب حلقة for أخرى. تبدأ هذه الحلقة من 5 وتعد تنازليًا حتى 1 ؛ يستمر حتى يصبح متغير التكرار أكبر من أو يساوي 1. لذا فإننا نقلص متغير التكرار بمقدار واحد بعد كل تكرار.

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := num; i >= 1; i-- {
		fmt.Println(i)
	}
}

ونحصل على الناتج المتوقع:

//Output
For loop:
5
4
3
2
1

ما هو نطاق المتغير الحلقي؟

يقتصر نطاق متغير الحلقات على كتلة الحلقة for ، ولا يمكن الوصول إليه خارج الحلقة.

  كيفية إصلاح مشكلة استخدام وحدة المعالجة المركزية عالية "خدمة مكافحة البرامج الضارة القابلة للتنفيذ"

للتحقق من ذلك ، دعنا نحاول الوصول إلى قيمة المتغير looping i خارج الحلقة:

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		fmt.Println(i)
	}
	fmt.Println(i)

}

كما هو متوقع ، واجهنا خطأ ينص على أن i غير محدد (ونطاقه مقيد إلى حلقة for):

// Output
./prog.go:11:14: undefined: i

لانهائي للحلقة في جولانج

هل يمكننا الحصول على حلقات for لانهائية في Go؟ نعم ، بالتأكيد نستطيع!

إذا نظرت إلى تدفق التحكم في حلقة for:

  • سيستمر تنفيذ جسم الحلقة طالما أن الشرط يصحح.
  • عندما يصبح الشرط خاطئًا ، يخرج عنصر التحكم من الحلقة.
  • لذلك إذا لم يصبح الشرط خاطئًا أبدًا (أو كان دائمًا صحيحًا) ، فلدينا حلقة لا نهائية.

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

package main

import "fmt"

func main() {
	for {
	   fmt.Println("running...")
	}
}
//Output
running...
running...
running...
running...
running...
//and it goes on forever!

في هذا المثال ، قمنا بتعيين المتغير num على 5. وشرط التكرار هو num> = 5. لذا فإن الحلقة تعمل طالما أن num أكبر من أو يساوي صفرًا.

package main

import "fmt"

func main() {
	num := 5
	for num > 0 {
		fmt.Println(num)
	}
}

نظرًا لأن قيمة num لا تتغير أبدًا ، يتم تقييم الشرط دائمًا إلى صحيح ، وتستمر الحلقة إلى الأبد!

//Output
5
5
5
5
5
5
//and it goes on forever!

كل Golang لديه بنية حلقة for فقط ، يمكننا محاولة محاكاة حلقات while و do-while باستخدام حلقات for. لذلك دعونا نتعلم كيفية القيام بذلك!

  كيفية تعطيل عرض 90 هرتز على Google Pixel 4 و Pixel 4 XL

محاكاة أثناء التكرار باستخدام For Loop

تأخذ حلقة while بشكل عام الشكل التالي:

// initialize looping var
while (condition){
    // do something
    // update looping var
} 

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

for {
// the simplest infinite loop
}

لذلك يمكننا تعديل الحلقة for لتحتوي فقط على الشرط (بالشكل التالي) لمحاكاة حلقة while:

//initialize looping var
for condition {
 // do something
 // update looping var
}

ها هي حلقة while المكافئة لحلقة for الأولى التي كتبناها:

package main

import "fmt"

func main() {
	fmt.Println("Emulating while loop")
	num := 5
	for num > 0 {
		fmt.Println(num)
		num--
	}
}
//Output
Emulating while loop
5
4
3
2
1

محاكاة Do-while Loop باستخدام For Loop

إذا قمت بالتشفير بلغة مثل C ، فأنت تعلم أن بناء حلقة do-while يأخذ الشكل التالي:

// initialize looping var
do {
//something
// update looping var
} while(condition);

يتمثل الاختلاف الرئيسي بين حلقة while and do while في أن حلقة while تتحقق من الشرط عند الدخول إلى الحلقة. من ناحية أخرى ، تقوم حلقة do-while بفحص الحالة عند الخروج من الحلقة.

لذلك ، في حلقة while loop ، إذا تم تقييم الشرط إلى false ، فلن يتم تنفيذ جسم الحلقة أبدًا. ومع ذلك ، في حلقة do-while loop ، يتم تنفيذ جسم الحلقة حتى إذا تم تقييم الحالة على أنها خطأ.

باستخدام هذه المعلومات ، يمكننا محاكاة سلوك حلقة do-while:

  • اكتب حلقة for لانهائية
  • استخدم عبارة if الشرطية مع الشرط الصحيح للخروج من الحلقة

لنفترض أنك تريد كتابة حلقة do-while حيث يكون شرط جسم الحلقة المطلوب تنفيذه هو عدد <0. لذا يمكنك كتابة حلقة for والخروج من الحلقة إذا كان num> = 0.

package main

import "fmt"

func main() {
	fmt.Println("Emulating do-while loop")
	num := 5
	for {
		fmt.Println("loop runs...")
		if num >= 0 {
			break
		}
	}
}

💡 لاحظ أن تنفيذ الحلقة إذا كان num <0 والخروج من الحلقة إذا كان num> = 0 هما شروط متكافئة.

على الرغم من أن عدد الشرط> 0 خاطئ في البداية (العدد هو 5) ، فإن جسم الحلقة يعمل مرة واحدة ، لمحاكاة حلقة do-while.

//Output
Emulating do-while loop
loop runs...

التكرار خلال المصفوفات باستخدام For Loop

عند التنقل عبر المصفوفات في Golang باستخدام حلقة for ونطاق ، يمكنك الوصول إلى كل من المؤشرات والعناصر. يعمل هذا بشكل مشابه لوظيفة التعداد في بايثون.

  6 منصات استضافة خوادم DayZ المميزة للاعبين

هنا ، نقوم بإنشاء numArray ، مجموعة من الأعداد الصحيحة. وحلقة من خلاله باستخدام حلقة for:

package main

import "fmt"

func main() {
	fmt.Println("Looping through an array")
	numArray := []int{3, 7, 0, 10, 8, 9}
	for idx, num := range numArray {
		fmt.Println("At index", idx, ": ", num)
	}
}

كما رأينا ، يمكننا الوصول إلى كل من الفهرس والعنصر في كل فهرس في وقت واحد:

//Output
Looping through an array
At index 0 :  3
At index 1 :  7
At index 2 :  0
At index 3 :  10
At index 4 :  8
At index 5 :  9

استخدام التأجيل في Golang For Loop

في Golang ، يمكنك استخدام الكلمة الأساسية defer لتأجيل استدعاءات الوظائف.

على الرغم من استخدامه في تطبيقات مثل تنظيف الموارد ومعالجة الأخطاء ، فقد يكون من المفيد فهم كيفية استخدام التأجيل داخل حلقة for. دعونا نرى ما يحدث عندما نستخدم defer داخل الحلقة for لتأجيل المكالمات إلى وظيفة Println ().

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		defer fmt.Println(i)
	}
}

💬 عند تأجيل استدعاء دالة ، يتم دفع استدعاء الوظيفة إلى المكدس ويتم تنفيذه بترتيب LIFO. يحدث هذا التنفيذ فقط بعد عودة الوظيفة التي تحيط بعبارة التأجيل.

لذلك يتم تنفيذ fmt.Println (5) أولاً ويتم تنفيذ fmt.Println (1) أخيرًا:

//Output
For loop:
5
4
3
2
1

خاتمة

فيما يلي ملخص لما تعلمته في هذا البرنامج التعليمي:

  • في Golang ، يمكنك إنشاء حلقات for باستخدام الصيغة: للتهيئة ؛ حالة؛ تحديث {// loop body}.
  • إن تدفق التحكم في الحلقة for بسيط للغاية. تتم تهيئة متغير looping مرة واحدة ، ويحدد شرط البحث ما إذا كان سيتم تنفيذ جسم الحلقة أم لا ، ويشير التحديث إلى تحديث متغير looping بعد كل تكرار.
  • يقتصر نطاق متغير الحلقات على جسم الحلقة ولا يمكن الوصول إليه خارج الحلقة.
  • على الرغم من أن Golang يوفر فقط بنية الحلقة for ، إلا أنه يمكنك محاكاة سلوكيات حلقة while و do-while باستخدام حلقات for.
  • تتضمن بعض التطبيقات الأخرى لـ for loop التكرار الحلقي عبر المصفوفات وتأجيل استدعاءات الوظيفة داخل جسم الحلقة for.

بعد ذلك ، تعرف على كيفية استخدام حلقات for في بايثون. تعلم سعيد!