Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تأكيدات النوع (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{}، مما يسمح لك بتحويل الواجهة العامة مرة أخرى إلى نوع محدد حتى تتمكن من استخدام أساليبه وعملياته.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرب على استخدام تأكيدات النوع (type assertions) لاستخراج القيم الملموسة والعمل معها بأمان من متغيرات الواجهة (interface). ستقوم بإنشاء محلل بيانات يعالج أنواعاً مختلفة من القيم المخزنة في واجهات فارغة (empty interfaces).

ستتلقى مدخلين:

  • سلسلة نصية تمثل نوع البيانات المراد التحقق منه (على سبيل المثال، "int"، أو "string"، أو "bool")
  • سلسلة نصية تمثل القيمة الفعلية (على سبيل المثال، "42"، أو "hello"، أو "true")

مهمتك هي:

  1. تحويل سلسلة القيمة النصية إلى نوع Go المناسب وتخزينها في متغير من نوع interface{}:
    • بالنسبة لـ "int": قم بالتحويل إلى عدد صحيح (integer)
    • بالنسبة لـ "string": استخدمها كسلسلة نصية (string)
    • بالنسبة لـ "bool": قم بالتحويل إلى قيمة منطقية (boolean)
  2. استخدام تأكيد النوع (type assertion) للتحقق مما إذا كان متغير الواجهة يحتوي على النوع المتوقع المحدد في المدخل الأول
  3. إذا نجح تأكيد النوع، اطبع: "Success: [value] is a [type]"
  4. إذا فشل تأكيد النوع، اطبع: "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. اطبع رسالة النجاح أو الفشل المناسبة
	
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow