الانتقال إلى المحتوى الرئيسي
الوحدة 6 · الدرس 3 من 528/50 في الدورة~10 min
دروس الوحدة (3/5)

اكتب التبديل

يميز مفتاح النوع بين عدة أنواع محتملة من ملف قيمة الواجهة. إنه تعميم comma ok عندما يكون هناك أكثر من حالة.

بناء الجملة

Go
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:

Go
switch i.(type) {
case int:
    // you know it's an int, but you don't have a variable of that type
case string:
    // ...
}

نموذج يستخدم عندما تحتاج فقط إلى تمييز النوع، وليس التشغيل على القيمة.

أنواع متعددة في نفس الحالة

Go
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)
}

حالة الاستخدام النموذجي: الطباعة المنسقة

Go
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 (المزيد قوية ولكنها أبطأ وأكثر تفصيلاً).

جربه

تمرين#go.m6.l3.e1
المحاولات: 0جارٍ التحميل…

قم بتنفيذ سلسلة وصف (i Interface {}) التي تُرجع "int" أو "string" أو "altro" اعتمادًا على النوع الديناميكي.

جارٍ تحميل المحرر…
إظهار التلميح

بناء الجملة: `switch i.(type) { case T: ... default: ... }`.

الحل متاح بعد 3 من المحاولات

تمرين#go.m6.l3.e2
المحاولات: 0جارٍ التحميل…

اكتب printVal(i Interface{}) الذي يستخدم v := i.(type) واطبع باستخدام %d لـ int و%s للسلسلة.

جارٍ تحميل المحرر…
إظهار التلميح

داخل `case int`، يحتوي v على نوع int (يمكنك تمريره إلى Printf).

الحل متاح بعد 3 من المحاولات

Quiz#go.m6.l3.e3
جاهز

ما هو بناء الجملة الذي يبدأ تبديل النوع؟

Go
switch ??? {
  case int: ...
}
خيارات الإجابة

خلاصة

  • switch v := i.(type) { case T: ... }: يميز على النوع الديناميكي.
  • داخل حالة من نوع واحد، v يحتوي على نوع الحالة.
  • case T1, T2: v يحتفظ بنوع الواجهة الأصلية.
  • default للحالات التي لم تتم معالجتها؛ case nil للواجهة الصفرية.
  • لا يوجد fallthrough في مفاتيح الكتابة.
  • نوع واحد → تأكيد النوع؛ 2+ أنواع → نوع التبديل.