0Pricing
Go Academy · درس

هياكل البيانات العامة

بناء Stack وSet عامَّين

هياكل البيانات العامة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

لماذا نستخدم هياكل البيانات العامة؟

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

المكدس العام

مكدس آمن من ناحية الأنواع باستخدام نوع عام:

type Stack[T any] struct{ items []T }
func (s *Stack[T]) Push(v T)        { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool)  {
    if len(s.items)==0 { var z T; return z, false }
    n := len(s.items)-1; v := s.items[n]; s.items = s.items[:n]; return v, true
}
func (s *Stack[T]) Len() int { return len(s.items) }

الطابور العام

طابور FIFO مدعوم بشريحة:

type Queue[T any] struct{ items []T }
func (q *Queue[T]) Enqueue(v T)     { q.items = append(q.items, v) }
func (q *Queue[T]) Dequeue() (T, bool) {
    if len(q.items)==0 { var z T; return z, false }
    v := q.items[0]; q.items = q.items[1:]; return v, true
}

المجموعة العامة

مجموعة مدعومة بخريطة، ويجب أن يكون نوع المفتاح قابلًا للمقارنة:

type Set[T comparable] struct{ m map[T]struct{} }
func NewSet[T comparable]() *Set[T] { return &Set[T]{m: make(map[T]struct{})} }
func (s *Set[T]) Add(v T)          { s.m[v] = struct{}{} }
func (s *Set[T]) Has(v T) bool     { _, ok := s.m[v]; return ok }
func (s *Set[T]) Delete(v T)       { delete(s.m, v) }

مساعد Map العام

دالة Map وظيفية وآمنة من ناحية الأنواع تعمل على الشرائح:

func Map[T, U any](s []T, f func(T) U) []U {
    out := make([]U, len(s))
    for i, v := range s { out[i] = f(v) }
    return out
}

التصفية العامة

أعد شريحة جديدة تحتوي فقط على العناصر التي تحقق شرطًا معيّنًا:

func Filter[T any](s []T, predicate func(T) bool) []T {
    var out []T
    for _, v := range s {
        if predicate(v) { out = append(out, v) }
    }
    return out
}

الاختزال العام

اختزل شريحة إلى قيمة واحدة:

func Reduce[T, U any](s []T, init U, f func(U, T) U) U {
    acc := init
    for _, v := range s { acc = f(acc, v) }
    return acc
}

OrderedMap

خريطة مرتبة تحافظ على ترتيب الإدراج، وهي مفيدة لتسلسل JSON بترتيب مفاتيح ثابت:

type OrderedMap[K comparable, V any] struct {
    keys []K
    vals map[K]V
}

القائمة المرتبطة العامة

قائمة مرتبطة مزدوجًا بعناصر آمنة من ناحية الأنواع:

type Node[T any] struct{ Val T; Next, Prev *Node[T] }
type List[T any] struct{ head, tail *Node[T]; len int }

القيود

لا يمكن للأنواع العامة استخدام type switches على T. ولا يمكن للأساليب في الأنواع العامة إضافة معلمات أنواع جديدة. كما لا يمكنك تخصيص نوع عام لنوع T محدد؛ فلا يوجد تخصيص للقوالب.

الأداء

يتم إنشاء مثيلات الأنواع العامة في Go باستخدام "GC shapes"؛ فالأنواع التي لها تخطيط الذاكرة نفسه تشترك في تنفيذ واحد. ويؤدي ذلك إلى تجنب تضخم الكود مع الحفاظ على أداء قريب من أداء التطبيقات ذات التنفيذات الملموسة.

متى لا تستخدم الأنواع العامة

تجنب الأنواع العامة في الحالات البسيطة التي تكفي فيها واجهة، أو عندما لا يتوفر لديك سوى نوع ملموس واحد أو نوعين؛ إذ إن التعقيد الإضافي يفوق الفائدة.

تحقق سريع

لماذا تتطلب المجموعة العامة القيد comparable على معلمة نوعها؟

مراجعة: هياكل البيانات العامة

النقاط الأساسية:

  • Stack وQueue وSet آمنة من ناحية الأنواع بفضل الأنواع العامة
  • المساعدات الوظيفية: Map وFilter وReduce على []T
  • Set[T comparable] للمجموعات المدعومة بالخرائط
  • لا توجد معلمات أنواع على مستوى الأسلوب، ولا يوجد تخصيص للقوالب

الأسئلة الشائعة

هل درس «هياكل البيانات العامة» مجاني؟

نعم — نص درس «هياكل البيانات العامة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «هياكل البيانات العامة»؟

بناء Stack وSet عامَّين تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «هياكل البيانات العامة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. صياغة معاملات الأنواع
  2. القيود: comparable والواجهات
  3. هياكل البيانات العامة
  4. التعميمات عمليًا: المشكلات
← العودة إلى Go Academy