"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > التحقق مما إذا كان النوع يلبي الواجهة في Go

التحقق مما إذا كان النوع يلبي الواجهة في Go

تم النشر بتاريخ 2024-11-06
تصفح:520

Checking if a Type Satisfies an Interface in Go

في Go، غالبًا ما يستخدم المطورون الواجهة لتحديد السلوك المتوقع، مما يجعل التعليمات البرمجية مرنة وقوية. ولكن كيف يمكنك التأكد من أن النوع ينفذ الواجهة بالفعل، خاصة في قاعدة تعليمات برمجية كبيرة؟ يوفر Go طريقة بسيطة وفعالة للتحقق من ذلك في وقت الترجمة، مما يمنع مخاطر أخطاء وقت التشغيل ويجعل التعليمات البرمجية الخاصة بك أكثر موثوقية وقابلة للقراءة.

ربما تكون قد شاهدت بناء جملة مثل

var _ InterfaceName = TypeName{} 
// or 
var _ InterfaceName = (*TypeName)(nil) 

في كود Go. سترشدك هذه المقالة إلى ما تفعله هذه السطور وسبب أهميتها.

كيفية التحقق من رضا الواجهة في Go

في Go، للتحقق مما إذا كان النوع (على سبيل المثال، البنية) ينفذ واجهة، يمكنك إضافة تأكيد وقت الترجمة. يخبر هذا التأكيد مترجم Go، "تأكد من أن هذا النوع ينفذ هذه الواجهة - الآن، وليس في وقت التشغيل."

هناك طريقتان للقيام بذلك:

var _ InterfaceName = TypeName{} 

أو، إذا كانت الواجهة تتطلب أجهزة استقبال المؤشر:

var _ InterfaceName = (*TypeName)(nil) 

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

متى يتم استخدام مستقبلات القيمة أو المؤشر

يعتمد الاختيار بين TypeName{} و(*TypeName)(nil) على كيفية تعريف أساليب النوع الخاص بك:

  1. مستقبلات القيمة: إذا قام TypeName بتنفيذ طرق الواجهة مع مستقبلات القيمة (على سبيل المثال، func (t TypeName) Method())، فيمكنك استخدام إما TypeName{} أو (*TypeName)(nil) في التأكيد الخاص بك. سيعمل كلا الخيارين نظرًا لأن Go يمكنه تحويل القيم إلى مؤشرات عند الحاجة.
  2. أجهزة استقبال المؤشر: إذا قام TypeName بتنفيذ أي طرق باستخدام أجهزة استقبال المؤشر (على سبيل المثال، func (t *TypeName) Method())، فيجب عليك استخدام (*TypeName)(nil). وهذا يضمن أن المؤشر إلى النوع يلبي الواجهة، حيث أن المؤشر فقط هو الذي يمكنه استدعاء الطريقة.

فوائد التحقق من رضا واجهة وقت الترجمة

يوفر استخدام اختبارات وقت الترجمة العديد من المزايا:

  • سلامة وقت الترجمة: تكتشف هذه الطريقة المشكلات المحتملة مبكرًا من خلال التأكد من أن الأنواع تلبي جميع متطلبات الواجهة، مما يساعدك على تجنب المفاجآت السيئة في وقت التشغيل.
  • وثائق واضحة: تعمل هذه التأكيدات كوثائق، توضح بوضوح أنه من المتوقع أن يقوم النوع بتنفيذ واجهة معينة. سيرى أي شخص يقرأ الكود الخاص بك على الفور أن هذا النوع يهدف إلى تلبية الواجهة، مما يجعل الكود أكثر قابلية للقراءة والصيانة.
  • إعادة هيكلة التعليمات البرمجية المرنة: مع وجود هذا الضمان، يمكنك بثقة إعادة بناء التعليمات البرمجية أو تغيير طرق الواجهة، مع العلم أن المترجم سوف ينبهك إذا كان أي نوع خارج عن الامتثال.

مثال في الممارسة

دعونا نلقي نظرة على مثال لجعله ملموسًا. لنفترض أن لدينا شكل واجهة بسيط ودائرة هيكلية:

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

للتحقق من أن الدائرة تنفذ الشكل، يمكننا إضافة تأكيد وقت الترجمة:

var _ Shape = Circle{}

أو، إذا كانت أساليب Circle تتطلب أجهزة استقبال للمؤشر:

var _ Shape = (*Circle)(nil)

خاتمة

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

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/kittipat1413/checking-if-a-type-satisfies-an-interface-in-go-432n?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3