الأساسيات

جملة الشرط التبديلي switch

الـ switch هو نوع آخر من أنواع الجمل الشرطية في لغة غو حيث نقدم له صيغة الشرط المطلوب وقائمة بالاحتمالات الممكنة, وأسفل كل احتمال ممكن نكتب الأسطر البرمجية التي نريد تنفيذها في حال تطابق الشرط مع الاحتمال,
أي أنه أشبه مايمكن بكتابة عدة أسطر من جمل الشرط if else.

مثال

package main

import (
"fmt"
)

func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")

}
}

في المثال السابق حددنا الشرط على أنه قيمة المتغير finger
ثم وضعنا قائمة بالاحتمالات الممكنة (5 أصابع)

وفي السطر التاسع كنا قد حددنا قيمة المتغير finger

والنتيجة ستكون

Ring
  • الحالة الافتراضية default case

    نحن نملك 5 أصابع, لكن ماذا لو حصل خطأ ما وكانت قيمة المتغير finger تساوي 8 مثلاً !
    عندها لن يساوي الشرط أياً من الاحتمالات الخمس الموجودة, ولكن يمكننا تعيين حالة افتراضية ينفذها البرنامج في مثل هذه الحالات
    مثال

package main

import (
"fmt"
)

func main() {
switch finger := 8; finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
default:
fmt.Println("incorrect finger number")
}
}

والنتيجة ستكون

incorrect finger number

نلاحظ أنه في السطر الثامن من المثال السابق أننا قد عرّفنا قيمة المتغير finger داخل جملة الشرط التبديلي switch إذاً فأصبح المتغير وقيمته لايمكن استخدامهما إلا داخل جملة الشرط, أي switch-scope

  • تعدد القيم في الاحتمال الواحد Multiple expressions in case

يمكننا أيضاً وضع عدة قيم في احتمال case واحد بشرط أن نفصل بينها بفاصلة عشرية كالمثال الاتي

package main

import (
"fmt"
)

func main() {
letter := "i"
switch letter {
case "a", "e", "i", "o", "u":
fmt.Println("vowel")
default:
fmt.Println("not a vowel")
}
}
  • بدون استخدام جملة شرط Expressionless switch

    يمكننا أيضاً في لغة غو أن نستخدم مفتاح الشرط التبديلي دون تحديد شرط معين في تعريف الـ switch
    كما في المثال التالي

package main

import (
	"fmt"
)

func main() {
	num := 75
	switch {
	case num >= 0 && num = 51 && num = 101:
		fmt.Println("num is greater than 100")
	}

}

نلاحظ أن قيمة المتغير تحقق الاحتمال الثاني, إذاً فالنتيجة ستكون

num is greater than 51 and less than 100
  • التأكد من عدة احتمالات fallthrough

في السويتش, عندما يجد البرنامج احتمال ما يحقق الشرط فإنه يختاره مباشرة ويهمل بقية الاحتمالات
لكن ماذا لو أردنا التحقق من باقي الاحتمالات حتى لو كنا حصلنا بالفعل على احتمال مناسب؟
هنا تأتي فعالية ميزة الـ fallthrough

الـ fallthrough تُكتب في نهاية الاسطر البرمجية لأحد الاحتمالات case وكأنها تقول للبرنامج “بعد الانتهاء من تنفيذ أسطر البرمجية, يرجى التحقق من الاحتمال الذي يليني مباشرةً أيضاً اذا كان يحقق الشرط”

فبالتالي يوجد قاعدتان لاستخدام الـ fallthrough
أولاً, يجب أن تُكتب في نهاية الأسطر البرمجية لإحدى الاحتمالات/الحالات case
ثانياً, لايجب أن نستخدم الـ fallthrough مع الاحتمال الأخير (لأنه الأخير, أي فلايوجد احتمال اخر بعده لكي يتم التحقق منه أيضاً !)

مثال

package main

import (  
    "fmt"
)

func number() int {  
        num := 15 * 5 
        return num
}

func main() {

    switch num := number(); {
    case num 

في هذا المثال نجد نظرياً أن قيمة المتغير num تحقق الاحتمال الثاني والثالث, ولكنها لاتحقق الاحتمال الأول.
إذاً فنحصل على النتيجة التالية

75 is lesser than 100
75 is lesser than 200

تدريب: حاول الان ان تعيد استخدام المثال السابق ولكن مع حذف الـ fallthrough من كافة الاحتمالات وثم قارن النتيجة لترى الفرق!

ملاحظة: يمكنك تشغيل أكواد وأمثلة لغة غو من خلال GoLang Playground أو GoPlay.Space .

نبذة عن الكاتب

Firas M. Darwish

Software Engineer, PHP/Laravel, C#, GoLang, founder of ArGoLang.com & others ..

شاركنا رأيك :)