تكرار تشغيل المهمة لعدد محدد من المرات
في الدرس السابق تأكدنا من أن jobName موجود و أن jobType مدعوم. الآن نريد محاكاة أكثر من محاولة لتشغيل المهمة.
package main
import "fmt"
const (
version = "v0.1"
maxAttempts = 3
)
type JobStatus int
const (
StatusPending JobStatus = iota
StatusRunning
StatusSucceeded
StatusFailed
)
func main() {
name := "jobrunner"
jobName := "send welcome email"
jobType := "email"
fmt.Println(name, version)
fmt.Println("max attempts:", maxAttempts)
if jobName == "" {
fmt.Println("invalid job: name is empty")
return
}
switch jobType {
case "email", "report":
// valid type
default:
fmt.Println("invalid job: unknown type", jobType)
return
}
}نستخدم for عندما نعرف أن المهمة تحتاج عددا محددا من المحاولات.
for attempt := 1; attempt <= maxAttempts; attempt++ {
fmt.Println("attempt", attempt, ":", "running", jobName)
}يبدأ attempt بالقيمة 1. تستمر الحلقة ما دام لا يتجاوز maxAttempts ثم يزيد attempt بعد كل محاولة. عندما يصل إلى 4، ينتهي الشرط و تتوقف الحلقة.
تحديث jobrunner
بعد أن أصبحت المهمة صالحة، يمكننا تكرار تنفيذ نفس العملية عدة مرات.
سنستخدم ذلك الآن لطباعة كل محاولة نحاكيها اعتمادا على قيمة maxAttempts. و في الدروس القادمة سنحول هذه المحاكاة إلى آلية إعادة تنفيذ حقيقية (Retry).
بما أن دور switch هنا أصبح التحقق من النوع فقط، نترك حالة email و report تمر دون طباعة. بعد ذلك نحاكي المحاولات داخل الحلقة بطباعة رقم كل محاولة.
func main() {
name := "jobrunner"
jobName := "send welcome email"
jobType := "email"
fmt.Println(name, version)
fmt.Println("max attempts:", maxAttempts)
if jobName == "" {
fmt.Println("invalid job: name is empty")
return
}
switch jobType {
case "email", "report":
// valid type
default:
fmt.Println("invalid job: unknown type", jobType)
return
}
for attempt := 1; attempt <= maxAttempts; attempt++ {
fmt.Println("attempt", attempt, ":", "running", jobName)
}
fmt.Println("done")
}شغل البرنامج باستخدام:
go run main.goستلاحظ أن الحلقة تنفذ ثلاث مرات لأن قيمة maxAttempts تساوي 3. جرب تغيير قيمة maxAttempts إلى 5 ثم شغل البرنامج مرة أخرى. ستلاحظ أن عدد مرات التكرار يتغير مباشرة دون الحاجة إلى تعديل الحلقة نفسها.

هذا مثال بسيط لكنه يوضح كيف يمكن استخدام for لتكرار تنفيذ أي جزء من البرنامج.
في الدروس القادمة سنستخدمها لمعالجة عدة مهام و لاحقا لبناء آلية إعادة المحاولة (Retry).
التحدي
في المحرر، افتح ملف main.go و أضف حلقة for تطبع رسالة تحاكي محاولة تنفيذ المهمة اعتمادا على قيمة maxAttempts ثم اطبع done بعد نهاية الحلقة.
يجب أن تكون المخرجات النهائية بالشكل التالي:
jobrunner v0.1
max attempts: 3
attempt 1 : running send welcome email
attempt 2 : running send welcome email
attempt 3 : running send welcome email
doneبعدها شغل البرنامج باستخدام:
go run main.goتأكد أن المخرجات مطابقة تماما ثم اضغط على زر تشغيل و تحقق لإكمال الدرس.
بعد إكمال الدرس، جرب تغيير قيمة maxAttempts إلى 5 و لاحظ كيف يتغير عدد أسطر المحاكاة دون تعديل الحلقة نفسها.
الخلاصة
أصبح jobrunner الآن قادرا على تكرار تنفيذ جزء من البرنامج باستخدام الحلقة for.
تعلمت استخدام for مع عداد لتكرار سطر المحاكاة حتى يصل عدد المحاولات إلى maxAttempts.
في الدرس القادم سنبدأ بتقسيم الكود إلى دوال (Functions)، حتى يصبح jobrunner أكثر تنظيما و أسهل في التطوير.