جملة `goto`
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 4 من 68.
تسمح لك عبارة goto في لغة Go بنقل التحكم مباشرة إلى عبارة ذات تسمية (labeled statement) داخل نفس الدالة. وبينما تتضمن Go هذه الميزة، إلا أنها نادراً ما تُستخدم في برمجة Go الحديثة لأن هياكل التحكم الأكثر وضوحاً مثل الحلقات (loops) وعبارات if تُعد مفضلة.
لاستخدام goto، تقوم أولاً بتعريف تسمية (label) عن طريق كتابة معرف متبوعاً بنقطتين رأسيتين. ثم يمكنك الانتقال إلى تلك التسمية باستخدام goto متبوعاً باسم التسمية.
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}في هذا المثال، يقفز البرنامج عائداً إلى التسمية start حتى لا يعود الشرط مستوفىً. ومع ذلك، فإن هذا المنطق نفسه سيكون أكثر وضوحاً باستخدام حلقة for. يمكن لتعليمة goto أن تجعل الكود أصعب في القراءة والصيانة، ولهذا السبب يتم تجنبها بشكل عام لصالح تدفق التحكم المنظم.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على استخدام عبارة goto لإنشاء آلية إعادة محاولة بسيطة. أنت تقوم ببناء نظام اتصال يحاول إنشاء اتصال ويعيد المحاولة لعدد محدد من المرات في حالة الفشل.
ستتلقى مدخلين:
- سلسلة نصية تمثل الحد الأقصى لعدد محاولات إعادة المحاولة (على سبيل المثال،
"3") - سلسلة نصية تمثل رقم المحاولة التي ستنجح (على سبيل المثال،
"2")
مهمتك هي:
- تحليل الحد الأقصى لمحاولات إعادة المحاولة من المدخل الأول
- تحليل رقم محاولة النجاح من المدخل الثاني
- استخدام عبارة
gotoمع تسمية (label) لتنفيذ منطق إعادة المحاولة - البدء بالمحاولة رقم 1 والزيادة بعد كل محاولة فاشلة
- لكل محاولة تفشل، اطبع
"Attempt [attempt_number] failed" - عندما يتطابق رقم المحاولة مع رقم محاولة النجاح، اطبع
"Attempt [attempt_number] succeeded"واخرج - إذا تجاوزت الحد الأقصى لمحاولات إعادة المحاولة دون نجاح، اطبع
"All attempts failed"واخرج
استخدم عبارة goto للقفز مرة أخرى إلى تسمية (label) إعادة المحاولة عندما تفشل محاولة ولم تتجاوز الحد الأقصى للمحاولات. يجب أن تبدأ أرقام المحاولات من 1.
ورقة مرجعية
ينقل بيان goto التحكم مباشرة إلى جملة ذات تسمية (labeled statement) داخل نفس الدالة. قم بتعريف تسمية باستخدام معرف متبوع بنقطتين رأسيتين، ثم انتقل إليها باستخدام goto:
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}بينما يتوفر goto في لغة Go، إلا أنه نادراً ما يُستخدم في برمجة Go الحديثة حيث أن تدفق التحكم المنظم مثل الحلقات وجمل if تكون أكثر وضوحاً وأسهل في الصيانة.
جرّب بنفسك
package main
import (
"fmt"
"strconv"
)
func main() {
// قراءة المدخلات
var maxRetriesStr string
var successAttemptStr string
fmt.Scanln(&maxRetriesStr)
fmt.Scanln(&successAttemptStr)
// تحويل المدخلات إلى أعداد صحيحة
maxRetries, _ := strconv.Atoi(maxRetriesStr)
successAttempt, _ := strconv.Atoi(successAttemptStr)
// تهيئة عداد المحاولات
attempt := 1
// TODO: اكتب الكود الخاص بك أدناه
// استخدم تعليمة goto مع تسمية (label) لتنفيذ منطق إعادة المحاولة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات