Generic Type Alias
أليس نوع بمعامل عام Generic Type Alias
منذ Go 1.24، يمكن لأليس نوع (type alias) أن يحمل معامل نوع خاصًّا به مثل نوع معرَّف عادي — اسم مختصر لنوع عام متكرّر دون إنشاء نوع منفصل جديد.
الفارق الجوهري بين أليس النوع (type X = Y) ونوع معرَّف جديد (type X Y) هو علامة "=": الأليس شفّاف تمامًا، فأي قيمة من نوعه هي فعليًا نفس النوع الأصلي بلا حاجة لتحويل صريح؛ بينما النوع الجديد منفصل فعليًا ويحتاج تحويلًا للتبادل مع الأصل. قبل Go 1.24 كان الأليس لا يقبل معاملات نوع خاصّة به إطلاقًا، فيضطرّ من يريد اسمًا مختصرًا لنوع عام متكرّر لتعريف نوع جديد كامل بدل أليس بسيط.
الآن type Set[T comparable] = map[T]bool يعطي اسمًا واضحًا لنوع map[T]bool المتكرّر، وأي قيمة منه قابلة للتبادل المباشر مع map[T]bool العادي بلا أي تحويل — لأنهما فعليًا نفس النوع وقت الترجمة.
الصياغة
type Alias[T constraint] = UnderlyingType[T]
📄 مثال
type Set[T comparable] = map[T]bool
func NewSet[T comparable](items ...T) Set[T] {
s := make(Set[T])
for _, item := range items {
s[item] = true
}
return s
}
var s Set[string] = NewSet("a", "b")
var m map[string]bool = s // يعمل مباشرة بلا تحويل — نفس النوع فعليًاأهم النقاط
| العنصر | الوظيفة |
|---|---|
| type X[T ...] = Y[T] | علامة "=" هي الفارق — بدونها يكون نوعًا معرَّفًا جديدًا منفصلًا لا أليس |
| Set[string] و map[string]bool | نفس النوع فعليًا وقت الترجمة، قابلان للتبادل بلا أي تحويل |
💡 نصائح عملية
- استخدم أليسًا عامًا لما تريد فقط اسمًا أوضح لنوع مركّب متكرّر (مثل map معيّن)، مع إبقائه متوافقًا تمامًا مع كل كود يستخدم النوع الأصلي
- لو تحتاج توابع (methods) خاصة بالنوع الجديد أو حماية من الخلط بأنواع أخرى، عرّف نوعًا جديدًا حقيقيًا لا أليس
⚠️ أخطاء شائعة
- توقّع أن أليسًا عامًا ينشئ نوعًا جديدًا فعليًا يمكن ربط توابع مخصّصة به — الأليس شفّاف تمامًا، والتوابع تُعرَّف على النوع الأصلي فقط
- الخلط بين "type X = Y" (أليس) و"type X Y" (نوع جديد) — حرف "=" وحده يغيّر السلوك جذريًا
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.