أمثلة على Generics Golang

Amthlt Ly Generics Golang



تتيح ميزة الأدوية العامة في Golang إمكانية إنشاء رمز قابل لإعادة الاستخدام يكون آمنًا من النوع ومتوافقًا مع مجموعة واسعة من الأنواع. لحسن الحظ ، فإن إضافة الأدوية الجنيسة إلى Go يفتح آفاقًا جديدة لإعادة استخدام الكود والمرونة. أحدث إصدار من Golang يجلب معه الدعم المتوقع بشدة للأدوية الجنيسة.

والأهم من ذلك ، تحافظ الأدوية الجنيسة على أمان قوي من النوع Go والذي يتيح التحقق من النوع الثابت في وقت الترجمة ويضمن صحة النوع. أنها توفر معالجة الأخطاء المعيارية داخل رمز عام مما يحسن الوضوح وقابلية الصيانة. بالإضافة إلى ذلك ، فإنها توفر معالجة الأخطاء المعيارية داخل الكود العام مما يحسن الوضوح وقابلية الصيانة. في هذا المنشور ، سنقوم بفحص العديد من تطبيقات وأمثلة Go Genics الواقعية.

مثال 1: استخدام وظيفة Golang العامة

إحدى حالات الاستخدام الأساسية للأدوية هي إنشاء وظائف يمكن أن تعمل على أنواع مختلفة. هنا ، نذهب مع أحد الأمثلة حيث يتم استخدام وظيفة المحيط العام.







طَرد رئيسي
يستورد 'FMT'
func محيط [ ص int | تعويم 32 ] ( نصف قطر ص ) {
ج : = 3 * 2 * نصف القطر
FMT . Println ( 'المحيط العام هو:' و ج )
}
func رئيسي () {
كان r1 int = 7
كان r2 تعويم 32 = 7 . 5
محيط ( r1 )
محيط ( r2 )
}

في بداية الكود السابق ، يستورد السطر الحزمة 'fmt' التي توفر وظائف للإدخال / الإخراج المنسق ، بما في ذلك طباعة الإخراج إلى وحدة التحكم. بعد ذلك ، نحدد دالة عامة تسمى 'محيط' تأخذ نصف قطر معلمة من النوع العام 'r' والذي يمكن أن يكون إما 'int' أو 'float32'. داخل الدالة ، تقوم بحساب المحيط بضرب نصف القطر بالقيمة الثابتة '3' ثم ضربه في '2'. أخيرًا ، يقوم بطباعة المحيط المحسوب باستخدام 'fmt.Println'.



بعد ذلك ، لدينا الوظيفة الرئيسية حيث يتم الإعلان عن متغيرين ، r1 و r2 ، ويتم تعيينهما بقيمتي 7 و 7.5 على التوالي. بعد ذلك ، يتم استدعاء دالة 'المحيط' مرتين ، لتمرير r1 و r2 كوسيطتين.



يعرض الإخراج الحساب عن طريق طباعة محيط الدوائر في ما يلي:





مثال 2: استخدام واجهة Golang العامة

علاوة على ذلك ، تساعدنا أدوية Golang في واجهاتهم. تعد الواجهات في Go أداة حيوية لتسهيل إعادة استخدام الكود وتعدد الأشكال. من خلال تمكينها من العمل مع أنواع عديدة ، تزيد الأدوية الجنيسة من قوة الواجهات. فيما يلي الكود المصدري لواجهة Golang generics:



طَرد رئيسي
يستورد 'FMT'
يكتب التمكين واجهه المستخدم {
int64 | int32 | تعويم 32 | تعويم 64
}
func newGenericFunc [ العمر العمر ] ( العمر_العمر ) {
فال : = int ( العمر_العمر ) + 1
FMT . Println ( فال )
}
func رئيسي () {
FMT . Println ( 'عمر الموظفين' )
كان العمر 1 int64 = 24
كان العمر 2 تعويم 64 = 25 . 5
newGenericFunc ( العمر 1 )
newGenericFunc ( العمر 2 )
}

في شفرة المصدر السابقة ، حددنا واجهة باسم 'EmpAge' تحدد الأنواع الممكنة لعمر الموظف. تتضمن الواجهة أنواع int64 و int32 و float32 و float64. تسمح هذه الواجهة للوظيفة 'العامة' بقبول أي من هذه الأنواع كوسيطة. بعد ذلك ، نستخدم وظيفة عامة تسمى newGenericFunc تأخذ المعلمة emp_Age لنوع عام من العمر والذي يمكن أن يكون أي نوع يلبي واجهة EmpAge. داخل الوظيفة ، يقوم بتحويل emp_Age إلى int ويزيدها بمقدار 1 كما هو موضح.

بعد ذلك ، نعلن عن المتغيرين ، Age1 و Age2 ، ونخصص قيم 24 و 25.5 ، على التوالي ، في الوظيفة الرئيسية. بعد ذلك ، يتم تمرير Age1 و Age2 كمعلمات إلى وظيفة newGenericFunc التي تخضع للتنفيذ مرتين. مع هذا ، يتم رفع الأعمار بمقدار 1 وإنشاء القيم المحدثة.

المخرجات الناتجة في ما يلي هي الأعمار من الوظيفة العامة التي تستخدم الواجهة:

مثال 3: استخدام بنية البيانات العامة لـ Golang

علاوة على ذلك ، تمنحنا Go Genics أيضًا القدرة على بناء هياكل البيانات العامة مثل الأكوام وقوائم الانتظار والقوائم المرتبطة. ضع في اعتبارك تنفيذ المكدس العام في ما يلي:

يستورد 'FMT'
يكتب كومة [ تي أي ] [] تي
func ( شارع * كومة [ تي ]) يدفع ( البند T ) {
شارع = ألحق ( * شارع و غرض )
}
func ( شارع * كومة [ تي ]) فرقعة () تي {
لو فقط ( * شارع ) == 0 {
ذعر ( 'لا شيء في Stack' )
}
فِهرِس : = فقط ( * شارع ) - 1
غرض : = ( * شارع ) [ فِهرِس ]
* شارع = ( * شارع ) [: فِهرِس ]
يعود غرض
}
func رئيسي () {
كومة : = جديد ( كومة [ int ])
كومة . يدفع ( 1 )
كومة . يدفع ( 2 )
كومة . يدفع ( 3 )
FMT . Println ( كومة . فرقعة ())
FMT . Println ( كومة . فرقعة ())
FMT . Println ( كومة . فرقعة ())
}

في الكود السابق ، تم تعريف نوع عام بعنوان 'Stack' والذي يمثل المكدس. يسمح العنصر النائب 'T' للمكدس بالاحتفاظ بالعناصر من أي نوع. يتم تنفيذ النوع 'Stack' كشريحة من العناصر من النوع 'T'. هنا ، يتم نشر وظيفتين لنوع 'Stack': 'Push' و 'Pop'. وظيفة Push () مسؤولة عن إضافة العناصر إلى المكدس. يأخذ عنصر وسيطة من النوع 'T' ويلحقه بالشريحة الأساسية باستخدام الوظيفة append ().

بينما تأخذ وظيفة Pop () المكون الأولي من المكدس وتعيده ، فإنها تحدد أولاً ما إذا كانت الحزمة فارغة عن طريق تقييم حجم الشريحة الأساسية. يتم إرسال إعلام بالخطأ إذا كان المكدس يبدو فارغًا مما يسبب حالة من الذعر. بخلاف ذلك ، يقوم باسترداد العنصر الأخير من الشريحة ، وإزالته من المكدس عن طريق تقطيع الشريحة إلى العنصر الثاني إلى الأخير ، وإرجاع العنصر الذي تمت إزالته.

بعد ذلك ، يتم إنشاء مجموعة الأعداد الصحيحة الجديدة باستخدام بناء الجملة Stack [int] ضمن الوظيفة الرئيسية لهذا الرمز. بعد ذلك ، يتم استدعاء طريقة 'Push' ثلاث مرات لإضافة الأعداد الصحيحة 1 و 2 و 3 إلى المكدس. ومع ذلك ، يتم استدعاء طريقة 'Pop' ثلاث مرات لاحقًا لاسترداد وطباعة العناصر من المكدس.

يشير الإخراج التالي إلى إزالة العناصر من المكدس بترتيب عكسي:

مثال 4: استخدام قيود Golang العامة

يوفر Go أيضًا قيودًا مخصصة تتيح مرونة كبيرة وتحدد متطلبات محددة للبنى العامة بناءً على احتياجات التطبيق الخاصة بهم. يتم توفير رمز القيود العامة المخصصة في ما يلي للتوضيح:

طَرد رئيسي
يستورد 'FMT'
يكتب الأعداد واجهه المستخدم {
int64 | تعويم 64
}
func رئيسي () {
FloatValue : = [] تعويم 64 { 2 . 0 و 4 . 0 و 6 . 0 و 8 . 0 و 10 . 0 }
قيمة عدد صحيح : = [] int64 { 2 و 4 و 6 و 8 و 10 }
مبلغ 1 : = عام ( FloatValue )
مجموع 2 : = عام ( قيمة عدد صحيح
fmt . Println ( 'مجموع float64:' و مبلغ 1 )
fmt . Println ( 'مجموع int64:' و مجموع 2 )

}
func عام [ ن الأعداد ] ( أعداد [] ن ) ن {
كان أنا في
ل _ و على واحد : = يتراوح أعداد {
مجموع + = على واحد
}
يعود مجموع
}

في كود المصدر السابق ، نحدد واجهة Numerics بطريقة 'Sum'. بعد ذلك ، نقوم بإنشاء نوعين مخصصين ، 'FloatValue' و 'IntegerValue' ، اللذان ينفذان واجهة Numerics من خلال توفير طرق 'Sum' الخاصة بهما. أصبحت وظيفة genericSum الآن قادرة على قبول الشرائح من أي نوع يتوافق مع واجهة Numerics. داخل الدالة ، نكرر العناصر ونطلق عليها طريقة 'Sum' لحساب المجموع. أخيرًا ، في الوظيفة الرئيسية ، نقوم بإنشاء شرائح FloatValue و IntegerValue ونمررها إلى الدالة genericSum () التي تحسب مجموع العناصر في كل شريحة بشكل صحيح.

الإخراج المتوقع مرئي الآن على الشاشة التالية:

خاتمة

استكشفنا بعض الأمثلة العملية للأدوية Go Genics التي تتضمن إنشاء بنية بيانات عامة ووظيفة عامة ، وتحديد واجهة عامة ، واستخدام قيد النوع المخصص. توضح هذه الأمثلة القوة والمرونة التي تجلبها الأدوية الجنيسة إلى لغة البرمجة Go. لاحظ أن إنشاء رمز الأدوية الجنسية أثناء التجميع يضمن الحجم الثنائي الفعال وأوقات التجميع.