المسارات
/
Go
Go
/
المنهج
/
تأكيد النوع
تأ

تأكيد النوع في Go

1 تمرين

نبذة عن تأكيد النوع

الواجهات في Go قد تُدخل غموضًا حول النوع الكامن. بل إن الواجهة الفارغة يمكنها أن تحمل أي قيمة ملموسة على الإطلاق (بما فيها القيم الأولية). يسمح لنا تأكيد النوع باستخراج القيمة الملموسة الكامنة لقيمة الواجهة باستخدام هذه الصياغة: interfaceVariable.(concreteType).

إذا أسندنا نتيجة هذه العبارة إلى قيمة واحدة، فإننا نؤكد أن متغير الواجهة يحمل قيمة من النوع الملموس. نتيجة لذلك، قد يتسبب ذلك في panic عند التشغيل إذا لم تكن قيمة الواجهة من النوع الملموس المحدد. على سبيل المثال:

var input interface{} = 12
str := input.(string) // panic at runtime since input is not a string!

يمكننا اختبار ما إذا كانت قيمة الواجهة تحمل نوعًا ملموسًا محددًا بالاستفادة من قيمتي الإرجاع لتأكيد النوع: القيمة الكامنة وقيمة منطقية تُبيّن ما إذا كان التأكيد قد نجح. على سبيل المثال:

str, ok := input.(string) // no panic if input is not a string

إذا كان input يحمل string، فستكون str هي القيمة الكامنة، وستكون قيمة ok صحيحة. إذا لم يكن input يحمل string، فستكون str هي القيمة الصفرية للنوع string (أي ""، وهي السلسلة النصية الفارغة)، وستكون قيمة ok خاطئة. ولا يحدث panic في أي حالة.

من الشائع رؤية هذا الأسلوب:

str, ok := input.(string)
if !ok {
    str = "a default value"
}

عبارات switch حسب النوع

يمكن أن تُجري switch حسب النوع عدة تأكيدات نوع على التوالي. لها نفس صياغة تأكيد النوع (interfaceVariable.(concreteType))، لكنها بدلًا من concreteType محدد تستخدم الكلمة المفتاحية type. إليك مثالًا:

var i interface{} = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}

switch v := i.(type) {
case int:
    fmt.Printf("the integer %d\n", v)
case string:
    fmt.Printf("the string %s\n", v)
default:
    fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم تأكيد النوع