أمثلة واجهات Golang

Amthlt Wajhat Golang



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

مثال 1: واجهة Golang الفارغة

ابدأ بالواجهة الفارغة {} والتي يشار إليها بالواجهة في Go. يشير إلى نوع يمكنه تخزين أي نوع من القيمة. فيما يلي الكود المصدري للواجهة الفارغة في Go:

طَرد رئيسي
يستورد 'FMT'
يكتب MarksCalculator واجهه المستخدم {}
func رئيسي () {
كان م ماركسآلة حاسبة
fmt . Println ( م )
}

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







الناتج الذي تم استرداده هو 'لا شيء' كما هو متوقع من كود المصدر السابق:





مثال 2: تنفيذ Golang للواجهة

يوضح هذا القسم تنفيذ واجهة Golang. يجب أن يقدم النوع التنفيذ لكل طريقة محددة في الواجهة من أجل تنفيذها في Go. فيما يلي الكود المصدري المعطى لتطبيق الواجهة:





طَرد رئيسي
يستورد (
'FMT'
)
يكتب الحروف المتحركة واجهه المستخدم {
البحث () [] رون
}
يكتب مايستر خيط
func ( سانت مايستر ) البحث () [] رون {
كان الحروف المتحركة [] رون
ل _ و رون : = يتراوح شارع {
لو رون == 'أ' || رون == 'إنها' || رون == 'أنا' || رون == 'يا' || رون == 'في' {
الحروف المتحركة = ألحق ( الحروف المتحركة و رون )
}
}
يعود الحروف المتحركة
}

func رئيسي () {
نيوسترينج : = مايستر ( 'واجهات GoLang' )
كان v1 أحرف العلة
الإصدار 1 = نيوسترينج
fmt . برنتف ( 'أحرف العلة٪ c' و الإصدار 1 . البحث ())
}

هنا ، يعرّف الكود واجهة باسم 'أحرف العلة' التي تحدد طريقة واحدة SearchVowels () تعيد شريحة من الرون (اكتب int32). تتيح الواجهة إمكانية تعيين أي نوع يقوم بتنفيذ توقيع الأسلوب هذا إلى متغير من نوع الواجهة. بعد ذلك ، يتم الإعلان عن نوع 'MyStr' جديد وهو اسم مستعار لسلسلة النوع الأساسي. هذا يعني أن 'MyStr' يرث جميع طرق السلسلة ولكنه نوع مميز.

بعد ذلك ، نقوم بتنفيذ طريقة SearchVowels () لنوع 'MyStr'. تقوم هذه الطريقة بمسح سلسلة الإدخال حرفًا تلو الآخر وتتحقق مما إذا كان كل حرف حرف متحرك ('a' أو 'e' أو 'i' أو 'o' أو 'u'). إذا كان الحرف حرفًا متحركًا ، يتم إلحاقه بشريحة حرف العلة.



داخل الدالة main () ، يتم إنشاء متغير 'NewString' من نوع 'MyStr' بقيمة 'GoLang Interfaces'. بعد ذلك ، يتم الإعلان عن متغير 'v1' من نوع 'أحرف العلة'. نظرًا لأن 'MyStr' يطبق طريقة SearchVowels () المحددة في واجهة 'أحرف العلة' ، يمكن تعيين 'NewString' إلى 'v1'.

يعرض الإخراج كل مجموعة أحرف العلة الموجودة في السلسلة المحددة:

مثال 3: واجهة Golang Stringer

بالإضافة إلى ذلك ، لدى Golang واجهة 'Stringer' المحددة مسبقًا في حزمة 'fmt'. يسمح للنوع المخصص بالتحكم في تمثيل السلسلة الخاص به عند تنسيقه باستخدام الفعل '٪ v' في وظائف طباعة الحزمة 'fmt'. فيما يلي مثال على رمز لواجهة stringer الخاصة بـ Go:

طَرد رئيسي
يستورد (
'FMT'
)
يكتب طالب هيكل {
اسم خيط
درجة خيط
}
func ( طالب ) خيط () خيط {
يعود fmt . سبرينتف ( '٪ s هو (n)٪ s' و س . اسم و س . درجة )
}
func رئيسي () {
ق 1 : = طالب { 'إيلينا جيلبرت' و 'علوم الكمبيوتر' }
    s2 : = طالب { كارولين كانديس و 'BBA' }
fmt . Println ( ق 1 )
fmt . Println ( s2 )
}

هنا ، يستورد الكود أولاً الحزمة الضرورية 'fmt' للطباعة على وحدة التحكم. بعد ذلك ، نحدد نوع الهيكل 'الطالب' مع حقلين: 'الاسم' و 'الدرجة'. تمثل هذه البنية معلومات الطالب. علاوة على ذلك ، يتم إنشاء طريقة String () لنوع 'Student'. تحتوي هذه الطريقة على مستقبل من النوع 'Student' وتقوم بإرجاع سلسلة. طريقة 'String ()' هي طريقة خاصة في Go تُستخدم لتخصيص تمثيل سلسلة كائن عند طباعته. في هذه الحالة ، يتم تنسيق طريقة 'String ()' وإرجاع سلسلة تتضمن اسم الطالب ودرجته.

بعد ذلك ، لدينا الوظيفة الرئيسية () حيث يتم الإعلان عن متغيرين ، s1 و s2 من نوع 'الطالب' ، وتهيئتهما بمعلومات الطالب. أخيرًا ، يستخدم الرمز الدالة fmt.Println () لطباعة قيم s1 و s2. نظرًا لأن طريقة String () محددة لنوع 'Student' ، يقوم Go تلقائيًا باستدعاء هذه الطريقة عند طباعة كائن 'Student'. تعمل طريقة String () على تنسيق معلومات الطالب باستخدام وظيفة 'fmt.Sprintf ()' وإرجاع السلسلة المنسَّقة.

الإخراج التالي يطبع كائن من نوع 'Student' لواجهة stringer:

مثال 4: واجهة تبديل نوع Golang

ثم تأتي واجهة تبديل النوع الخاصة بـ Go. مفتاح النوع هو هيكل تحكم يسمح لنا بفحص النوع الديناميكي لقيمة الواجهة. اتبع الكود المصدري لواجهة تبديل النوع:

طَرد رئيسي
يستورد 'fmt
func MyFunction (واجهة F1 {}) {
التبديل F1. (نوع) {
حالة int:
fmt.Println ('
يكتب : int و قيمة : '، F1. (أنت))
سلسلة حالة:
fmt.Println ('
\ n النوع : خيط و قيمة : '، F1. (سلسلة))
حالة تعويم 64:
fmt.Println ('
\ n النوع : تعويم 64 و قيمة : '، F1. (float64))
تقصير:
fmt.Println ('
\ n النوع غير صالح ')
}
}
func main () {
وظيفتي ('
واجهات Golang البرنامج التعليمي ')
وظيفتي (89.7)
وظيفتي (صحيح)
}

هنا ، يحدد الكود المقدم وظيفة 'MyFunction' التي تأخذ معلمة 'F1' من نوع 'الواجهة {}'. يشير هذا إلى أن 'F1' يمكن أن يقبل قيمة من أي نوع. داخل الوظيفة ، يتم استخدام عبارة switch مع 'F1. (type)' للتحقق من نوع القيمة التي يتم تمريرها إلى 'MyFunction'. يتم استخدام بناء الجملة '. (النوع)' في نوع التبديل للحصول على النوع الديناميكي الأساسي لقيمة الواجهة. لاحظ أن حالات التبديل هنا تتعامل مع ثلاثة أنواع محددة: 'int' و 'string' و 'float64'. إذا كان النوع 'F1' يطابق إحدى هذه الحالات. يطبع النوع والقيمة المقابلة باستخدام تأكيدات النوع (F1. (int) ، F1. (سلسلة) ، F1. (float64)). إذا كان النوع 'F1' لا يتطابق مع أي من الحالات المحددة ، يتم تنفيذ الحالة الافتراضية التي تطبع 'النوع غير صالح'.

بعد ذلك ، في الدالة main () ، يتم استدعاء 'MyFunction' ثلاث مرات بقيم مختلفة: سلسلة نصية ، و float64 ، و Boolean (التي لا يتم التعامل معها في بيان التبديل).

يعرض الإخراج شرحًا لواجهة التبديل مع تأكيدات النوع:

مثال 5: واجهات متعددة لـ Golang

علاوة على ذلك ، تقدم Go واجهات متعددة تسمح لها بتوفير مجموعات مختلفة من السلوكيات حسب السياق. تسمى هذه الميزة 'واجهات متعددة' أو 'تكوين الواجهة'. يوضح الكود التالي تنفيذ واجهات متعددة:

طَرد رئيسي
يستورد 'FMT'
يكتب الطيور واجهه المستخدم {
يتنفس ()
يطير ()
}

يكتب الطيور واجهه المستخدم {
يٌطعم ()
}
يكتب أين هيكل {
عمر int
}
func ( د أين ) يتنفس () {
FMT . Println ( 'الحمامة تتنفس' )
}
func ( د أين ) يطير () {
FMT . Println ( 'دوف يطير' )
}
func ( د أين ) يٌطعم () {
FMT . Println ( 'حمامة تنشئة الأطفال' )
}
func رئيسي () {
كان ب الطيور
د : = أين {}
ب = د
ب . يتنفس ()
ب . يطير ()
كان الطيور
أ = د
أ . يٌطعم ()
}

هنا ، نحدد واجهتين: 'الطيور' و 'الطيور'. تعلن واجهة 'الطيور' عن طريقتين: التنفس () والطيران (). بينما تعلن واجهة 'avians' عن طريقة feed (). بعد ذلك ، تقوم بنية 'الحمامة' بتنفيذ جميع أساليب واجهات 'الطيور' و 'الطيور'. يوفر تطبيقات التنفس () ، الطيران () ، والتغذية ().

بعد ذلك ، نعلن عن المتغير 'b' لنوع 'الطيور' ضمن الدالة () الرئيسية. يتم إنشاء مثيل من 'الحمامة' وتعيينه إلى 'b' باستخدام التخصيص b = d. نظرًا لأن 'الحمامة' تنفذ جميع طرق واجهة 'الطيور' ، فإن هذا التخصيص صالح.

ثم يتم استدعاء طريقتي التنفس () والطيران () على 'ب' وهي من النوع 'طيور'. وبالمثل ، يتم الإعلان عن المتغير 'a' من النوع 'avians' وتعيينه بمثيل 'dove' لـ 'd'. نظرًا لأن 'dove' تنفذ طريقة feed () التي تم تحديدها في واجهة 'avians' ، فإن هذا التخصيص صالح أيضًا. يتم استدعاء طريقة التغذية () على 'أ' وهي من النوع 'الطيور'. نظرًا لأن 'a' يحمل مثيل 'dove' ، يتم تنفيذ طريقة feed () التي يتم تنفيذها بواسطة 'dove'.

يوضح الإخراج أن طرق الواجهات يتم تنفيذها بشكل صحيح:

خاتمة

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