تبديل النوع (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، خاصةً عندما تحتاج إلى معالجة عدة أنواع مختلفة في مكان واحد.
التحدي
سهلفي هذا التحدي، ستتدرّب على استخدام تبديلات الأنواع للتعامل مع أنواع بيانات متعددة في نظام إشعارات. ستنشئ دالة تعالج أنواعًا مختلفة من الإشعارات وتنسّقها بالشكل المناسب استنادًا إلى نوعها الفعلي.
ستتلقى مُدخلَين:
- سلسلة نصية تمثّل نوع الإشعار (مثل
"email"أو"sms"أو"push"أو"alert") - سلسلة نصية تمثّل محتوى الإشعار أو قيمته
مهمتك هي:
- إنشاء دالة باسم
processNotificationتأخذ مُعاملًا من النوعinterface{} - استنادًا إلى مُدخل نوع الإشعار، حوّل المحتوى إلى نوع Go المناسب وخزّنه في متغير من النوع
interface{}:- لـ
"email": استخدم المحتوى كسلسلة نصية - لـ
"sms": حوّل المحتوى إلى عدد صحيح (يمثّل عدد الأحرف) - لـ
"push": حوّل المحتوى إلى قيمة منطقية (صحيح لـ "enabled"، وخطأ لأي شيء آخر) - لـ
"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. أنشئ الدالة processNotification التي تأخذ معاملًا من النوع interface{}
// 2. حوّل content إلى النوع المناسب بناءً على notificationType
// 3. استدعِ processNotification بالقيمة المحوّلة
// 4. استخدم type switch داخل processNotification للتعامل مع الأنواع المختلفة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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 عبر الإنترنت