دروس الوحدة (3/5)
اكتب التبديل
يميز مفتاح النوع بين عدة أنواع محتملة من ملف
قيمة الواجهة. إنه تعميم comma ok عندما يكون هناك
أكثر من حالة.
بناء الجملة
func describe(i interface{}) string {
switch v := i.(type) {
case int:
return fmt.Sprintf("int %d", v)
case string:
return fmt.Sprintf("string %q", v)
case nil:
return "nil"
default:
return fmt.Sprintf("altro tipo: %T", v)
}
}i.(type)عبارة عن تركيبة خاصة، صالحة فقط داخلswitch.v := ...يربط القيمة بنوع الحالة الحالية: داخلcase int،vله النوعint.defaultيلتقط جميع الأنواع الأخرى؛ هناكvيحتوي على نوع الواجهة الأصلية.case nilيطابق الواجهة بنوع ديناميكي صفري.
قضية "مجهولة الاسم".
إذا لم تكن بحاجة إلى القيمة المكتوبة، فيمكنك حذف v:
switch i.(type) {
case int:
// you know it's an int, but you don't have a variable of that type
case string:
// ...
}نموذج يستخدم عندما تحتاج فقط إلى تمييز النوع، وليس التشغيل على القيمة.
أنواع متعددة في نفس الحالة
switch v := i.(type) {
case int, int64:
// here v is still interface{}: the "common" type is just the interface
fmt.Println("numero intero:", v)
case string:
// here v is string
fmt.Println("stringa:", v)
}حالة الاستخدام النموذجي: الطباعة المنسقة
func print(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("%d\n", v)
case string:
fmt.Printf("%s\n", v)
case fmt.Stringer:
fmt.Println(v.String())
default:
fmt.Printf("%v\n", v)
}
}fmt.Println نفسه يستخدم مفتاح النوع داخليًا للتعامل مع
التنسيقات القياسية.
نوع التبديل مقابل الانعكاس
بالنسبة لبعض الأنواع المعروفة، → اكتب مفتاح التبديل (سريع، قابل للقراءة).
للفحص الديناميكي للأنواع غير المعروفة → الحزمة reflect (المزيد
قوية ولكنها أبطأ وأكثر تفصيلاً).
جربه
قم بتنفيذ سلسلة وصف (i Interface {}) التي تُرجع "int" أو "string" أو "altro" اعتمادًا على النوع الديناميكي.
إظهار التلميح
بناء الجملة: `switch i.(type) { case T: ... default: ... }`.
الحل متاح بعد 3 من المحاولات
اكتب printVal(i Interface{}) الذي يستخدم v := i.(type) واطبع باستخدام %d لـ int و%s للسلسلة.
إظهار التلميح
داخل `case int`، يحتوي v على نوع int (يمكنك تمريره إلى Printf).
الحل متاح بعد 3 من المحاولات
ما هو بناء الجملة الذي يبدأ تبديل النوع؟
switch ??? {
case int: ...
}خلاصة
switch v := i.(type) { case T: ... }: يميز على النوع الديناميكي.- داخل حالة من نوع واحد،
vيحتوي على نوع الحالة. case T1, T2:vيحتفظ بنوع الواجهة الأصلية.defaultللحالات التي لم تتم معالجتها؛case nilللواجهة الصفرية.- لا يوجد
fallthroughفي مفاتيح الكتابة. - نوع واحد → تأكيد النوع؛ 2+ أنواع → نوع التبديل.