الواجهة الفارغة
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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{}.
التحدي
سهلفي هذا التحدي، ستتدرّب على استخدام الواجهة الفارغة بإنشاء معالج بيانات يمكنه التعامل مع أنواع مختلفة من القيم. ستنشئ دالة تقبل وسيطًا من النوع interface{} وتعالج أنواعًا مختلفة من البيانات.
ستتلقى مُدخلين:
- سلسلة نصية تمثل نوع البيانات (مثل
"int"أو"string"أو"bool"أو"slice") - سلسلة نصية تمثل القيمة الفعلية (مثل
"42"أو"hello"أو"true"أو"1,2,3")
مهمتك هي:
- إنشاء دالة باسم
processDataتأخذ وسيطًا من النوعinterface{}وتطبع معلومات عن القيمة - استنادًا إلى مُدخل نوع البيانات، حوّل سلسلة القيمة إلى نوع Go المناسب:
- لـ
"int": حوّلها إلى عدد صحيح - لـ
"string": استخدمها كسلسلة نصية - لـ
"bool": حوّلها إلى قيمة منطقية - لـ
"slice": حوّل القيم المفصولة بفواصل إلى شريحة من الأعداد الصحيحة
- لـ
- استدعِ الدالة
processDataمع القيمة المحوّلة - داخل
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 بالقيمة المحوّلة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت