تبديل النوع (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، لا سيما عندما تحتاج إلى معالجة عدة أنواع مختلفة في مكان واحد.
التحدي
سهلفي هذا التحدي، ستتدرّب على استخدام تبديلات الأنواع للتعامل مع أنواع بيانات متعددة في نظام إشعارات. ستنشئ دالة تعالج أنواعًا مختلفة من الإشعارات وتنسّقها بشكل مناسب استنادًا إلى نوعها الفعلي.
ستتلقى مُدخلين:
- سلسلة نصية تمثّل نوع الإشعار (مثلًا:
"email"أو"sms"أو"push"أو"alert") - سلسلة نصية تمثّل محتوى الإشعار أو قيمته
مهمتك هي:
- إنشاء دالة تُسمّى
processNotificationوتأخذ مُعاملًا من النوعinterface{} - استنادًا إلى مُدخل نوع الإشعار، حوّل المحتوى إلى نوع Go المناسب وخزّنه في متغيّر من النوع
interface{}:- بالنسبة إلى
"email": استخدم المحتوى كسلسلة نصية - بالنسبة إلى
"sms": حوّل المحتوى إلى عدد صحيح (يمثّل عدد الأحرف) - بالنسبة إلى
"push": حوّل المحتوى إلى قيمة منطقية (true بالنسبة إلى "enabled"، وfalse لأي قيمة أخرى) - بالنسبة إلى
"alert": حوّل المحتوى إلىfloat64(يمثّل مستوى الأولوية)
- بالنسبة إلى
- استدعِ الدالة
processNotificationباستخدام القيمة المحوّلة - داخل
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(¬ificationType)
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
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت