الشروط: if
age := 18
if age >= 18 {
fmt.Println("بالغ")
} else if age >= 13 {
fmt.Println("مراهق")
} else {
fmt.Println("طفل")
}
لا أقواس حول الشرط، لكن الأقواس المعقوفة إلزامية حتى مع سطر واحد، وelse يجب أن تكون على نفس سطر القوس المغلق }. هذا ليس أسلوبًا بل قاعدة: المترجم يرفض غيره. والشرط يجب أن يكون bool حقيقيًا؛ if count لعدد صحيح خطأ ترجمة، اكتب if count != 0.
if مع جملة تهيئة
يمكنك تنفيذ جملة قصيرة قبل الشرط، والمتغيّر الناتج يعيش داخل if وelse فقط:
if n, err := strconv.Atoi("42"); err == nil {
fmt.Println("رقم:", n)
} else {
fmt.Println("ليس رقمًا:", err)
}
// n و err غير موجودين هنا
هذا النمط منتشر جدًّا مع الأخطاء، لأنه يبقي المتغيّر في أضيق نطاق ممكن.
switch
day := "الجمعة"
switch day {
case "الجمعة", "السبت":
fmt.Println("عطلة")
case "الأحد":
fmt.Println("بداية الأسبوع")
default:
fmt.Println("يوم عمل")
}
عكس C، لا سقوط تلقائي: كل case تنتهي وحدها بلا break. وتقدر تضع عدّة قيم في case واحدة بفاصلة. وإذا احتجت السقوط عمدًا فهناك كلمة fallthrough، لكنها نادرة.
وswitch بلا قيمة تعمل كسلسلة if/else أنظف:
score := 75
switch {
case score >= 90:
fmt.Println("ممتاز")
case score >= 60:
fmt.Println("ناجح")
default:
fmt.Println("راسب")
}
الحلقات: for فقط
Go لها حلقة واحدة هي for، بأربعة أشكال:
// 1. العدّاد الكلاسيكي
for i := 0; i < 3; i++ {
fmt.Print(i, " ") // 0 1 2
}
fmt.Println()
// 2. مثل while
count := 3
for count > 0 {
count--
}
// 3. المرور على شريحة أو خريطة أو نص بـ range
nums := []int{10, 20, 30}
for index, value := range nums {
fmt.Println(index, value)
}
// 4. منذ Go 1.22: المرور على عدد صحيح
for i := range 3 {
fmt.Print(i, " ") // 0 1 2
}
fmt.Println()
والحلقة اللانهائية for { ... } بلا شرط، تُستخدم مع break أو return (خوادم، قراءة من قناة).
إذا لم تحتج الفهرس في range استبدله بـ _: for _, v := range nums. وإذا لم تحتج القيمة احذفها: for i := range nums.
break و continue مع التسميات
break تخرج من الحلقة الداخلية فقط. للخروج من حلقتين، سمِّ الخارجية:
outer:
for r := 0; r < 3; r++ {
for c := 0; c < 3; c++ {
if r*c == 2 {
break outer
}
fmt.Println(r, c)
}
}
الدوال
func add(a, b int) int { // معاملان من نفس النوع: النوع مرة واحدة
return a + b
}
القيم المتعدّدة المُعادة
ميزة أساسية في Go: الدالة تُرجع أكثر من قيمة، وأشهر استخدام لها قيمة + خطأ:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("القسمة على صفر")
}
return a / b, nil
}
func main() {
result, err := divide(10, 2)
if err != nil {
fmt.Println("خطأ:", err)
return
}
fmt.Println(result) // 5
}
لاحظ الترتيب: افحص الخطأ أولًا واخرج مبكّرًا، ثم أكمل بالمسار الطبيعي بلا else. هذا هو الشكل المعتاد لكود Go، وستراه في كل مكان. التفاصيل في درس معالجة الأخطاء، وباقي ميزات الدوال (المعاملات المتغيّرة، والإغلاقات، وdefer) في درس الدوال المتقدّمة.
أخطاء شائعة
elseعلى سطر جديد: خطأ ترجمة (syntax error: unexpected else). اكتب} else {.if xلعدد أو نص: الشرط يجب أن يكونbool.- تعديل القيمة في
range:for _, v := range nums { v *= 2 }تعدّل نسخة؛ لتعديل الشريحة استخدم الفهرس:nums[i] *= 2. - تجاهل الخطأ المُرجع:
result, _ := divide(...)يُسكت الخطأ؛ افحصه إلا إذا كنت متأكدًا أنه مستحيل.
🎯 التالي: أنواع البيانات والقيم الصفرية.