تصميم واجهة Plugin
عقود الواجهات المشتركة بين المضيف وPlugin
تصميم واجهة Plugin درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
إضافات قائمة على الواجهات
عرّف واجهة Go مستقرة يجب أن تنفذها الإضافات. يحمّل المضيف الإضافة، ويحصل على التنفيذ، ويستدعيه عبر الواجهة، من دون الحاجة إلى تأكيد النوع في كل دالة.
type Processor interface {
Name() string
Process(ctx context.Context, data []byte) ([]byte, error)
}نقطة دخول الإضافة
تُصدّر كل إضافة رمزًا معروفًا (مثل Plugin) يعيد تنفيذ الواجهة:
// In the plugin:
var Plugin processor // exported symbol
type processor struct{}
func (p processor) Name() string { return "my-processor" }
func (p processor) Process(ctx context.Context, data []byte) ([]byte, error) {
return bytes.ToUpper(data), nil
}التحميل عبر الواجهة
في المضيف، حمّل الرمز وأكّد أنه من نوع الواجهة:
sym, _ := p.Lookup("Plugin")
proc, ok := sym.(Processor)
if !ok { log.Fatal("plugin does not implement Processor") }نمط السجل
احتفظ بسجل للإضافات المحمّلة حسب الاسم:
var registry = map[string]Processor{}
func register(p Processor) { registry[p.Name()] = p }
func get(name string) (Processor, bool) {
p, ok := registry[name]
return p, ok
}إصدار الواجهة
أضف دالة Version() إلى الواجهة حتى يتمكن المضيف من التحقق من التوافق قبل تسجيل الإضافة.
type Versioned interface {
APIVersion() string
}
if v, ok := proc.(Versioned); ok && v.APIVersion() != "1.0" {
log.Fatalf("incompatible plugin version: %s", v.APIVersion())
}السياق والإلغاء
مرّر السياق عبر استدعاءات دوال الإضافة حتى يتمكن المضيف من إلغاء عمليات الإضافة الطويلة عند إيقاف التشغيل أو عند انتهاء مهلة الطلب.
عقد معالجة الأخطاء
حدّد ما إذا كان ينبغي للإضافات إطلاق panic أو إرجاع أخطاء عند الفشل. ويُعد إرجاع الأخطاء أكثر أمانًا، إذ قد لا تتمكن البرمجية الوسيطة recover في المضيف من اعتراض حالات panic في الإضافات.
الإعداد
مرّر الإعداد إلى الإضافات عند التحميل عبر دالة Init(config map[string]string) error. ويفصل ذلك إنشاء الإضافة عن إعدادها.
إدارة دورة الحياة
أضف Close() error إلى الواجهة للإضافات التي تحتفظ بموارد (مثل اتصالات DB أو goroutines) تحتاج إلى تنظيفها عند إيقاف التشغيل.
اختبار الإضافات بشكل مستقل
اختبر تنفيذ الإضافة مباشرةً (باعتبارها حزمة Go) من دون تحميل الملف الثنائي .so. وتجعل الواجهة اختبار المحاكاة أمرًا مباشرًا.
عقد التوثيق
وثّق عقد الواجهة بوضوح: متى تُستدعى الدوال، وضمانات التنفيذ المتزامن، وما الذي يُعد خطأً مقابل حالة قاتلة.
تحقق سريع
لماذا نعرّف واجهة Go مستقرة للإضافات بدلًا من البحث عن رموز الدوال الفردية؟
مراجعة: تصميم واجهة الإضافة
النقاط الأساسية:
- عرّف واجهة مستقرة يجب أن تنفذها الإضافة
- صدّر رمزًا معروفًا (var Plugin InterfaceType) من الإضافة
- أجرِ تأكيدًا واحدًا للنوع عند التحميل؛ وجميع الاستدعاءات آمنة النوع عبر الواجهة
- أضف Version() وInit() وClose() لإدارة دورة الحياة
الأسئلة الشائعة
هل درس «تصميم واجهة Plugin» مجاني؟
نعم — نص درس «تصميم واجهة Plugin» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «تصميم واجهة Plugin»؟
عقود الواجهات المشتركة بين المضيف وPlugin تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تصميم واجهة Plugin»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.