الواجهة الفارغة
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 16 من 68.
حتى الآن، عملتَ مع واجهات تتطلب أساليب محددة، لكن لدى Go واجهة خاصة مرنة للغاية: الواجهة الفارغة، وتُكتب كالتالي interface{}.
لا تتطلب الواجهة الفارغة أي أساليب على الإطلاق، ما يعني أن أي نوع في Go يستوفيها تلقائيًا. وبما أن كل نوع يطبّق صفرًا من الأساليب (على الأقل)، يمكن إسناد كل نوع إلى متغير من نوع interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceهذا يجعل interface{} مفيدًا للغاية عندما تحتاج إلى التعامل مع data من أنواع غير معروفة أو متباينة. قد تواجه هذا عند قراءة ملفات الإعداد، أو معالجة input المستخدم، أو العمل مع واجهات API تُرجع أنواعًا مختلفة من data وفقًا للموقف.
ومع ذلك، بما أن الواجهة الفارغة يمكنها الاحتفاظ بأي نوع، فستحتاج غالبًا إلى تحديد النوع المخزَّن فعليًا بداخلها قبل أن تتمكن من استخدام القيمة بشكل ذي معنى. وهنا تصبح تأكيدات النوع ومفاتيح النوع (التي ستتعلّم عنها لاحقًا) أدوات أساسية للعمل بأمان مع قيم interface{}.
التحدي
سهلفي هذا التحدي، ستتدرّب على العمل باستخدام الواجهة الفارغة من خلال إنشاء معالج بيانات يمكنه التعامل مع أنواع مختلفة من القيم. ستنشئ دالة function تقبل معلَمة من النوع 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 عبر الإنترنت