Menu
flag Ar iconالعربيةdown icon

if else في Golang: الصياغة وعبارة التهيئة وif err != nil

كيف تعمل if وelse if وelse في Go: دون أقواس، مع أقواس معقوصة إلزامية، وعبارة if مع جزء تهيئة ونطاقه، ونمط if err != nil، والعودة المبكرة بدل التداخل العميق.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

لا توجد في if في Go أقواس حول الشرط، والأقواس المعقوصة إلزامية دائمًا، ويمكن أن تبدأ بعبارة قصيرة تعرّف متغيّرات نطاقها هو if.

تُفحص الشروط من الأعلى ويُنفَّذ أول فرع صحيح. وelse if وelse اختياريتان.

قواعد الصياغة

ثلاث قواعد تختلف عن C وJava وJavaScript:

  1. لا أقواس حول الشرط. if (x > 5) تُترجم، لكن gofmt يزيل الأقواس.
  2. الأقواس المعقوصة إلزامية، حتى لعبارة واحدة. لا توجد صيغة if x > 5 return دونها.
  3. توضع else في السطر نفسه مع القوس الختامي. تُدرج Go فاصلة منقوطة بعد } في نهاية السطر، فيفشل هذا:
if x > 5 {
	fmt.Println("big")
}
else {
	fmt.Println("small")
}
syntax error: unexpected keyword else, expected }

اكتب } else { في سطر واحد.

يجب أن يكون الشرط من النوع bool. لا تعامل Go القيم 0 أو "" أو nil كقيمة خاطئة، فلا تُترجم if count {} ولا if name {}. قارن صراحة: if count > 0 وif name != "" وif user != nil.

اجمع الشروط بـ && (و) و|| (أو) و! (نفي). تتوقّف && و|| مبكرًا عند حسم النتيجة، وهذا يجعل فحوص nil آمنة:

if user != nil && user.IsAdmin() {
	// user.IsAdmin() is only called when user is not nil
}

if مع عبارة تهيئة

يمكن لـ if تنفيذ عبارة قصيرة واحدة قبل الشرط، مفصولة بفاصلة منقوطة. المتغيّرات المعرّفة فيها مرئية في كل فروع تلك الـ if، ولا تُرى في أي مكان بعدها:

يُبقي هذا النمط المتغيّرات قصيرة العمر خارج النطاق المحيط. ويظهر باستمرار مع البحث في الخرائط (v, ok := m[k]) وتأكيدات النوع (s, ok := v.(string)) والأخطاء.

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

نمط if err != nil

الدوال التي قد تفشل تعيد error أخيرًا. افحصه فورًا، وعالجه أو أعده، وتابع المسار الناجح دون إزاحة:

لاحظ أنه لا توجد else بعد if err != nil { return ... }. أسلوب Go يعالج الخطأ ويعود، ويترك التدفّق العادي عند بداية السطر. صفحة معالجة الأخطاء تشرح التغليف وفحص أنواع الأخطاء.

العودة المبكرة بدل التداخل

كتل if المتداخلة بعمق صعبة القراءة. اعكس الشروط وعُد مبكرًا؛ فيُقرأ كل فحص كحارس:

// Nested
func canCheckout(u *User, cart *Cart) bool {
	if u != nil {
		if u.Verified {
			if len(cart.Items) > 0 {
				return true
			}
		}
	}
	return false
}

// Guards
func canCheckout(u *User, cart *Cart) bool {
	if u == nil || !u.Verified {
		return false
	}
	if len(cart.Items) == 0 {
		return false
	}
	return true
}

يسمّي مبرمجو Go هذا إبقاء المسار الناجح دون إزاحة. تبلغ أدوات الفحص مثل revive عن else بعد كتلة تنتهي بـ return، لأن else تضيف إزاحة بلا فائدة.

if/else مقابل switch

سلسلة طويلة من else if تختبر قيمة واحدة مقابل عدة حالات تُقرأ أفضل كـ switch. والـ switch دون تعبير يحلّ محل سلسلة if/else if من شروط اعتباطية:

switch {
case score >= 90:
	return "A"
case score >= 80:
	return "B"
default:
	return "F"
}

استخدم if لفرع أو فرعين، وswitch عندما تصير ثلاثة أو أكثر.

لا معامل ternary

لا تملك Go الصيغة cond ? a : b. أسند بـ if:

label := "odd"
if n%2 == 0 {
	label = "even"
}

صفحة معامل ternary تشرح السبب وتعرض البدائل.

أخطاء شائعة

  • التظليل بـ :=. تعرّف if x, err := f(); err == nil { ... } متغيّرًا x جديدًا داخل if وحدها. لا يُحدَّث x الخارجي.
  • الإسناد في الشرط. if x = 5 {} خطأ ترجمة (cannot use assignment x = 5 as value)، لا خطأ صامت كما في C. استخدم ==.
  • مقارنة الأعداد العشرية بـ ==. if total == 0.3 تفشل مع القيم المحسوبة. قارن بهامش تسامح.
  • فحص الخطأ الخطأ. بعد a, err := f() وb, err := g() تأكّد أن كل if err != nil تقع مباشرة بعد استدعائها.

الأسئلة الشائعة

كيف تكتب if else في Go؟

دون أقواس حول الشرط، ومع أقواس معقوصة إلزامية دائمًا:

if x > 10 {
	fmt.Println("big")
} else if x > 5 {
	fmt.Println("medium")
} else {
	fmt.Println("small")
}

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

ما هي عبارة if مع عبارة تهيئة في Go؟

عبارة قصيرة قبل الشرط، مفصولة بفاصلة منقوطة: if n, err := strconv.Atoi(s); err != nil { ... }. المتغيّرات المعرّفة هناك توجد فقط داخل if وفروعها else if وelse، فلا تتسرّب إلى بقية الدالة.

هل يمكنني كتابة if في سطر واحد في Go؟

ليس دون أقواس معقوصة. if ok return وif (ok) x = 1; خطآن في الصياغة. أقصر شكل هو if ok { return }، ويضع gofmt الجسم في سطر خاص به. ولا تملك Go معامل ternary، فالقيمة الشرطية تحتاج if/else أو دالة مساعدة صغيرة.

لماذا تستخدم Go عبارة if err != nil في كل مكان؟

لا تملك Go استثناءات. الدوال التي قد تفشل تعيد error كآخر نتيجة، ويفحصها المستدعي فورًا بـ if err != nil. هذا التكرار هو ثمن ظهور كل نقطة فشل في مكان حدوثها.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن