Menu
CoddyTech

تبديل النوع (Type Switch)

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 18 من 68.

بينما تعمل تأكيدات النوع جيدًا للتحقق من نوع واحد، غالبًا ما تحتاج إلى التعامل مع أنواع محتملة متعددة لمتغير واجهة. وهنا يصبح تبديل النوع مفيدًا للغاية، إذ يوفر طريقة واضحة لتنفيذ إجراءات مختلفة بناءً على النوع الفعلي.

يستخدم تبديل الأنواع هذه الصياغة الخاصة: switch v := i.(type). لاحظ الكلمة المفتاحية (type) بدلًا من نوع محدد. سيحتوي المتغير v على القيمة الفعلية بنوعها المحدد في كل حالة:

func describe(data interface{}) {
    switch v := data.(type) {
    case int:
        fmt.Printf("Integer: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Boolean: %t\n", v)
    default:
        fmt.Printf("Unknown type: %T\n", v)
    }
}

في كل حالة، يكون نوع v صحيحًا تلقائيًا، ولا حاجة إلى أي تأكيد إضافي للنوع. وهذا يجعل مفاتيح الأنواع أكثر وضوحًا بكثير من ربط عدة تأكيدات للنوع باستخدام عبارات if-else، خاصةً عندما تحتاج إلى معالجة عدة أنواع مختلفة في مكان واحد.

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرّب على استخدام تبديلات الأنواع للتعامل مع أنواع بيانات متعددة في نظام إشعارات. ستنشئ دالة تعالج أنواعًا مختلفة من الإشعارات وتنسّقها بالشكل المناسب استنادًا إلى نوعها الفعلي.

ستتلقى مُدخلَين:

  • سلسلة نصية تمثّل نوع الإشعار (مثل "email" أو "sms" أو "push" أو "alert")
  • سلسلة نصية تمثّل محتوى الإشعار أو قيمته

مهمتك هي:

  1. إنشاء دالة باسم processNotification تأخذ مُعاملًا من النوع interface{}
  2. استنادًا إلى مُدخل نوع الإشعار، حوّل المحتوى إلى نوع Go المناسب وخزّنه في متغير من النوع interface{}:
    • لـ "email": استخدم المحتوى كسلسلة نصية
    • لـ "sms": حوّل المحتوى إلى عدد صحيح (يمثّل عدد الأحرف)
    • لـ "push": حوّل المحتوى إلى قيمة منطقية (صحيح لـ "enabled"، وخطأ لأي شيء آخر)
    • لـ "alert": حوّل المحتوى إلى float64 (يمثّل مستوى الأولوية)
  3. استدعِ الدالة processNotification مع القيمة المحوّلة
  4. داخل processNotification، استخدم تبديل الأنواع للتعامل مع كل نوع وطباعة الرسالة المناسبة:
    • لـ string: "Email notification: [value]"
    • لـ int: "SMS notification with [value] characters"
    • لـ bool: "Push notifications: [value]"
    • لـ float64: "Alert with priority: [value]"
    • لأي نوع آخر: "Unknown notification type"

استخدم الحزمة strconv لتحويل السلاسل النصية. عند التحويل إلى قيمة منطقية، يجب أن ينتج "enabled" وحده القيمة true. يوضّح هذا التحدي كيف توفّر تبديلات الأنواع طريقة واضحة للتعامل مع أنواع متعددة ضمن بنية تحكم واحدة، مع إتاحة القيمة ذات النوع الصحيح تلقائيًا في كل حالة.

اطبع float64 بأقصر تمثيل له، كما تفعل fmt.Println أو أفعال التنسيق %v / %g: تُطبع 3.5 بالشكل 3.5 و1.0 بالشكل 1 (أما فعل التنسيق %f فيطبع 1.000000).

جرّب بنفسك

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// اقرأ المدخلات
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: اكتب الكود الخاص بك أدناه
	// 1. أنشئ الدالة processNotification التي تأخذ معاملًا من النوع interface{}
	// 2. حوّل content إلى النوع المناسب بناءً على notificationType
	// 3. استدعِ processNotification بالقيمة المحوّلة
	// 4. استخدم type switch داخل processNotification للتعامل مع الأنواع المختلفة
	
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت