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

نوع التأكيد

تأكيد النوع يستخرج النوع الملموس من قيمة الواجهة. أنت في حاجة إليها عندما يكون لديك interface{} (أو واجهة "عالية") في اليد وتحتاج إلى التعامل معها كنوع محدد للوصول إلى الحقول أو الأساليب غير موجودة على الواجهة.

بناء الجملة

Go
var i interface{} = "ciao"

s := i.(string)           // "panic" form: panics if it's not a string
s, ok := i.(string)       // "comma ok" form: ok = false if it's not a string

شكلان ودلالتان:

النموذجالنجاحفشل
محمي_INLINE_6v = قيمة النوع T** الذعر ** في وقت التشغيل
محمي_INLINE_8محمي_INLINE_9, محمي_INLINE_10v = القيمة الصفرية لـ T، ok=false

نموذج "Comma ok": الأكثر أمانًا

Go
var i interface{} = 42

if s, ok := i.(string); ok {
    fmt.Println("è stringa:", s)
} else {
    fmt.Println("non è stringa, ignoro")
}

يتيح لك ok التعامل مع حالة "النوع الخاطئ" دون ذعر. انها النمط الاصطلاحي في الغالبية العظمى من الحالات.

التأكيد على الواجهة

لا ينطبق التأكيد على الأنواع الملموسة فقط، بل على أنواع أخرى أيضًا واجهات:

Go
type Closer interface { Close() error }

func tryClose(x interface{}) {
    if c, ok := x.(Closer); ok {
        c.Close()
    }
}

نمط شائع جدًا في المكتبة القياسية: "إذا كانت مدخلاتي أيضًا io.Closer، اتصل بالإغلاق في النهاية".

التأكيد على المؤشرات مقابل القيم

يجب أن يتطابق التأكيد مع النوع الديناميكي تمامًا:

Go
type Cat struct{}
func (c *Cat) Meow() {}

var a interface{} = &Cat{}

c1, ok := a.(*Cat)   // ok = true
c2, ok := a.(Cat)    // ok = false: it holds *Cat, not Cat

*Cat وCat هما نوعان متميزان لنظام الكتابة.

متى يتم استخدام التأكيد مقابل مفتاح النوع

  • نوع واحد محتمل فقط، التحقق من "الكشف عن الميزات" (على سبيل المثال الإرسال إلى واجهة اختيارية): تأكيد النوع مع comma ok.
  • 2+ أنواع محتملة، الإرسال عبر فروع متعددة: نوع التبديل (الدرس التالي).

جربه

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

استخدم نمط الفاصلة موافق لاستخراج سلسلة من i.

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

بناء الجملة: `v، ok := i.(T)`.

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

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

اكتب التأكيد على int بدون فاصلة ok (بافتراض أنني يحتوي على int).

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

بدون `ok` تفترض أن النوع مؤكد؛ خلاف ذلك الذعر.

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

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

ماذا يحدث مع `s := i.(string)` إذا كنت تحتوي على int؟

Go
var i interface{} = 42
s := i.(string)
خيارات الإجابة

خلاصة

  • v := i.(T): الذعر إذا كان النوع الديناميكي ≠ T.
  • v, ok := i.(T): النمط الآمن، حدد ok.
  • يعمل أيضًا ضد واجهة أخرى ("كشف الميزة").
  • T و*T هما نوعان متميزان للتأكيد.
  • نوع واحد → التأكيد؛ 2+ أنواع → نوع التبديل.