تأكيدات النوع (Type Assertions)
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 17 من 68.
عند العمل مع متغيرات الواجهة (interface variables)، غالباً ما تحتاج إلى الوصول إلى القيمة الملموسة الفعلية المخزنة بداخلها. هنا يأتي دور تأكيدات النوع (type assertions) - فهي تتيح لك استخراج القيمة الأساسية واستخدامها بأمان.
يستخدم تأكيد النوع (type assertion) هذا النحو: value, ok := interfaceVariable.(Type). القيمة الراجعة الأولى هي القيمة المستخرجة من النوع المحدد، والثانية هي قيمة منطقية (boolean) تخبرك ما إذا كان التأكيد ناجحاً.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}المتغير ok ضروري للسلامة. إذا حاولت تأكيد نوع خاطئ، ستكون قيمة ok هي false، وستكون قيمة value هي القيمة الصفرية (zero value) لذلك النوع. بدون التحقق من ok، سيؤدي فشل تأكيد النوع إلى توقف البرنامج بشكل مفاجئ (panic).
تعد تأكيدات النوع (Type assertions) ضرورية عند التعامل مع قيم interface{}، مما يسمح لك بتحويل الواجهة العامة مرة أخرى إلى نوع محدد حتى تتمكن من استخدام أساليبه وعملياته.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على استخدام تأكيدات النوع (type assertions) لاستخراج القيم الملموسة والعمل معها بأمان من متغيرات الواجهة (interface). ستقوم بإنشاء محلل بيانات يعالج أنواعاً مختلفة من القيم المخزنة في واجهات فارغة (empty interfaces).
ستتلقى مدخلين:
- سلسلة نصية تمثل نوع البيانات المراد التحقق منه (على سبيل المثال،
"int"، أو"string"، أو"bool") - سلسلة نصية تمثل القيمة الفعلية (على سبيل المثال،
"42"، أو"hello"، أو"true")
مهمتك هي:
- تحويل سلسلة القيمة النصية إلى نوع Go المناسب وتخزينها في متغير من نوع
interface{}:- بالنسبة لـ
"int": قم بالتحويل إلى عدد صحيح (integer) - بالنسبة لـ
"string": استخدمها كسلسلة نصية (string) - بالنسبة لـ
"bool": قم بالتحويل إلى قيمة منطقية (boolean)
- بالنسبة لـ
- استخدام تأكيد النوع (type assertion) للتحقق مما إذا كان متغير الواجهة يحتوي على النوع المتوقع المحدد في المدخل الأول
- إذا نجح تأكيد النوع، اطبع:
"Success: [value] is a [type]" - إذا فشل تأكيد النوع، اطبع:
"Failed: value is not a [type]"
يجب عليك استخدام صيغة تأكيد النوع الآمنة مع متغير ok للتحقق مما إذا كان التأكيد ناجحاً. يختبر التحدي فهمك لكيفية استخراج القيم الملموسة بأمان من متغيرات الواجهة دون التسبب في توقف البرنامج المفاجئ (panic).
بالنسبة لتحويل القيم المنطقية، يجب تحويل "true" إلى true وأي سلسلة نصية أخرى يجب تحويلها إلى false. استخدم حزمة strconv لتحويل السلسلة النصية إلى عدد صحيح.
ورقة مرجعية
تسمح لك تأكيدات النوع (Type assertions) باستخراج قيم ملموسة من متغيرات الواجهة (interface variables) باستخدام الصيغة value, ok := interfaceVariable.(Type):
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}يشير المتغير ok إلى ما إذا كان التأكيد ناجحاً. إذا كانت القيمة false، فستكون value هي القيمة الصفرية (zero value) لذلك النوع. تحقق دائماً من ok لمنع حدوث حالات panic الناتجة عن فشل التأكيدات.
جرّب بنفسك
package main
import (
"fmt"
"strconv"
)
func main() {
// قراءة المدخلات
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// متغير لتخزين قيمة الواجهة (interface)
var interfaceValue interface{}
// TODO: اكتب الكود الخاص بك أدناه
// 1. قم بتحويل valueStr إلى النوع المناسب بناءً على dataType وقم بتخزينه في interfaceValue
// 2. استخدم تأكيد النوع (type assertion) للتحقق مما إذا كان interfaceValue يحتوي على النوع المتوقع
// 3. اطبع رسالة النجاح أو الفشل المناسبة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
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)ملخص - الأشكال والسلوكيات