Menu
CoddyTech

الواجهة الفارغة

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 16 من 68.

حتى الآن، عملتَ مع واجهات تتطلب طرائق محددة، لكن لدى Go واجهة خاصة تتميز بمرونة كبيرة: الواجهة الفارغة، وتُكتب بهذا الشكل interface{}. منذ Go 1.18، يمكنك أيضًا كتابتها بالشكل any، وهو اسم مستعار مضمّن يعني بالضبط interface{}.

لا تتضمن الواجهة الفارغة أي متطلبات للطرق، وهذا يعني أن أي نوع في Go يحققها تلقائيًا. وبما أن كل نوع ينفّذ صفرًا من الطرق (على الأقل)، يمكن إسناد كل نوع إلى متغير من النوع interface{}:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // شريحة

وهذا يجعل interface{} مفيدًا للغاية عندما تحتاج إلى التعامل مع بيانات ذات أنواع غير معروفة أو متغيرة. قد تواجه ذلك عند قراءة ملفات الإعدادات، أو معالجة مدخلات المستخدم، أو التعامل مع واجهات API التي تُرجع أنواعًا مختلفة من البيانات حسب الحالة.

ومع ذلك، بما أن الواجهة الفارغة يمكنها احتواء أي نوع، فغالبًا ما ستحتاج إلى تحديد النوع المخزَّن فيها فعليًا قبل أن تتمكن من استخدام القيمة على نحو مفيد. وهنا تصبح تأكيدات الأنواع ومفاتيح تبديل الأنواع (التي ستتعلم عنها لاحقًا) أدوات أساسية للعمل بأمان مع قيم interface{}.

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرّب على استخدام الواجهة الفارغة بإنشاء معالج بيانات يمكنه التعامل مع أنواع مختلفة من القيم. ستنشئ دالة تقبل وسيطًا من النوع interface{} وتعالج أنواعًا مختلفة من البيانات.

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

  • سلسلة نصية تمثل نوع البيانات (مثل "int" أو "string" أو "bool" أو "slice")
  • سلسلة نصية تمثل القيمة الفعلية (مثل "42" أو "hello" أو "true" أو "1,2,3")

مهمتك هي:

  1. إنشاء دالة باسم processData تأخذ وسيطًا من النوع interface{} وتطبع معلومات عن القيمة
  2. استنادًا إلى مُدخل نوع البيانات، حوّل سلسلة القيمة إلى نوع Go المناسب:
    • لـ "int": حوّلها إلى عدد صحيح
    • لـ "string": استخدمها كسلسلة نصية
    • لـ "bool": حوّلها إلى قيمة منطقية
    • لـ "slice": حوّل القيم المفصولة بفواصل إلى شريحة من الأعداد الصحيحة
  3. استدعِ الدالة processData مع القيمة المحوّلة
  4. داخل processData، اطبع القيمة ونوعها بالتنسيق: "Value: [value], Type: [type]"

بالنسبة إلى مُدخل الشريحة، يجب تحويل السلسلة المفصولة بفواصل، مثل "1,2,3"، إلى []int{1, 2, 3}. ينبغي أن تعمل الدالة مع أي نوع لأنها تقبل interface{}، وهذا يوضح كيف يمكن للواجهة الفارغة أن تحتوي على قيم من أي نوع. استخدم fmt.Printf مع محددَي التنسيق %v و%T لعرض القيمة والنوع على التوالي.

جرّب بنفسك

package main

import (
	"fmt"
)

func main() {
	// اقرأ المدخلات
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// TODO: اكتب الكود الخاص بك أدناه
	// 1. أنشئ الدالة processData التي تقبل interface{}
	// 2. حوّل valueStr إلى النوع المناسب بناءً على dataType
	// 3. استدعِ processData بالقيمة المحوّلة
	
}
quiz iconاختبر نفسك

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

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت