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

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

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

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

يستخدم تبديل النوع هذه الصياغة الخاصة: 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": حوّل المحتوى إلى قيمة منطقية (true بالنسبة إلى "enabled"، وfalse لأي قيمة أخرى)
    • بالنسبة إلى "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. Create processNotification function that takes interface{} parameter
	// 2. Convert content to appropriate type based on notificationType
	// 3. Call processNotification with the converted value
	// 4. Use type switch inside processNotification to handle different types
	
}
quiz iconاختبر نفسك

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

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

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