صياغة معاملات الأنواع
الدوال والأنواع العامة باستخدام [T any]
صياغة معاملات الأنواع درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
مقدمة عن Generics
قبل Go 1.18، كان الكود الذي يعمل مع أنواع متعددة يتطلب إما interface{}/any (مع فقدان أمان الأنواع) أو توليد الكود. تضيف Generics معاملات أنواع لتحقيق تعدد الأشكال وقت الترجمة.
صياغة الدوال العامة
أعلنوا معاملات الأنواع بين قوسين مربعين بعد اسم الدالة:
func Map[T, U any](s []T, f func(T) U) []U {
result := make([]U, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
nums := Map([]int{1,2,3}, func(n int) string {
return strconv.Itoa(n)
})استنتاج النوع
يستنتج المترجم وسيطات الأنواع من وسيطات الدالة في معظم الحالات. ويمكنكم تحديدها صراحةً إذا تعذر الاستنتاج.
// Inferred:
nums := Map([]int{1,2,3}, strconv.Itoa)
// Explicit:
nums := Map[int, string]([]int{1,2,3}, strconv.Itoa)الأنواع العامة
يمكن أن تحتوي البُنى والأنواع الأخرى أيضًا على معاملات أنواع:
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 zero T; return zero, false }
n := len(s.items)-1
v := s.items[n]
s.items = s.items[:n]
return v, true
}معاملات أنواع متعددة
يمكن أن تحتوي الدوال والأنواع على عدة معاملات أنواع:
type Pair[K, V any] struct { Key K; Value V }
func Zip[K, V any](keys []K, vals []V) []Pair[K, V] {
result := make([]Pair[K, V], min(len(keys), len(vals)))
for i := range result {
result[i] = Pair[K, V]{keys[i], vals[i]}
}
return result
}القيمة الصفرية لمعامل النوع
أعلنوا عن متغير ذي قيمة صفرية باستخدام var zero T. ويكون ذلك ضروريًا عند إعادة نتيجة «لا قيمة» من دالة عامة.
func First[T any](s []T) (T, bool) {
if len(s) == 0 { var zero T; return zero, false }
return s[0], true
}الدوال التابعة للأنواع العامة
تستخدم الدوال التابعة لنوع عام معاملات النوع الخاصة بذلك النوع، وليس معاملات خاصة بها. ولا يمكن للدالة التابعة إضافة معاملات أنواع أخرى.
type Pair[K, V any] struct{ K K; V V }
func (p Pair[K, V]) Swap() Pair[V, K] { return Pair[V, K]{p.V, p.K} }إنشاء مثيل
يُسمى استخدام نوع عام مع وسيطة نوع ملموسة إنشاءَ مثيل. ويحدث ذلك وقت الترجمة، لا وقت التشغيل؛ لذلك لا توجد تكلفة إضافية للتغليف.
s := Stack[int]{}
s.Push(42)أسماء الأنواع المستعارة والأنواع العامة
يمكنكم إنشاء أسماء مستعارة للأنواع العامة التي أُنشئت مثيلاتها:
type IntStack = Stack[int]القيود
لا يمكن استخدام معاملات الأنواع مع مفاتيح الأنواع أو تأكيدات الأنواع. ولا يمكن للدوال التابعة للأنواع العامة امتلاك معاملات أنواع إضافية. كما لا يمكن استخدام Generics مع الأنواع التي تُحمّل عواملها دون قيود.
متى تستخدمون Generics
استخدموا Generics للخوارزميات التي لا تعتمد فعلًا على نوع محدد (مثل أنواع الحاويات والمساعدات الوظيفية مثل Map/Filter/Reduce)، عندما يكون البديل تكرار الكود أو التحويلات غير الآمنة.
تحقق سريع
أين تُعلن معاملات الأنواع في الدالة العامة؟
مراجعة: صياغة معاملات الأنواع
النقاط الأساسية:
- معاملات الأنواع بين قوسين مربعين: func Foo[T any](...)
- تعمل مع الدوال والأنواع (مثل struct وغيرها)
- يستنتج المترجم وسيطات الأنواع من الوسيطات في معظم الحالات
- القيمة الصفرية: var zero T؛ ولا توجد معاملات أنواع على مستوى الدالة التابعة
الأسئلة الشائعة
هل درس «صياغة معاملات الأنواع» مجاني؟
نعم — نص درس «صياغة معاملات الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «صياغة معاملات الأنواع»؟
الدوال والأنواع العامة باستخدام [T any] تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «صياغة معاملات الأنواع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- صياغة معاملات الأنواع
- القيود: comparable والواجهات
- هياكل البيانات العامة
- التعميمات عمليًا: المشكلات