التحميل الديناميكي والرموز
تحميل Plugins وقت التشغيل واستدعاء الرموز المُصدَّرة
التحميل الديناميكي والرموز درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
plugin.Open
يحمّل plugin.Open(path) ملف .so مُترجمًا. ويهيّئ دوال init() ومتغيرات مستوى الحزمة في الإضافة، ثم يجعل الرموز متاحة.
p, err := plugin.Open("./plugins/mymodule.so")
if err != nil { log.Fatalf("load: %v", err) }p.Lookup
يبحث p.Lookup(name) عن رمز مُصدَّر حسب الاسم. ويعيد قيمة من النوع any؛ أكّد نوعها وفق النوع المتوقع.
sym, err := p.Lookup("NewProcessor")
if err != nil { log.Fatalf("lookup: %v", err) }
fn, ok := sym.(func() Processor)
if !ok { log.Fatal("wrong type") }تحميل إضافات متعددة
حمّل كل ملف .so من دليل وسجّله ضمن حلقة تكرار:
entries, _ := os.ReadDir("./plugins")
for _, e := range entries {
if !strings.HasSuffix(e.Name(), ".so") { continue }
p, err := plugin.Open("./plugins/" + e.Name())
if err != nil { log.Printf("skip %s: %v", e.Name(), err); continue }
loadPlugin(p)
}نمط دالة المُنشئ
تُصدّر الإضافات دالة مُنشئ (NewXxx() Processor) بدلًا من قيمة، حتى يحصل المضيف على نسخة جديدة في كل استدعاء:
sym, _ := p.Lookup("NewProcessor")
factory := sym.(func() Processor)
proc := factory() // new instanceمعالجة الأخطاء عند البحث
تعني أخطاء Lookup أن الرمز غير مُصدَّر أو أن الاسم غير صحيح. عالج الخطأ بسلاسة، فتجاوز الإضافة أو سجّل الخطأ وتابع تحميل الإضافات الأخرى.
plugin.Open دالة متكررة آمنة
يؤدي استدعاء plugin.Open على المسار نفسه مرتين إلى إعادة الإضافة نفسها. ولا تتم تهيئة الإضافة إلا مرة واحدة.
التحميل الكسول
حمّل الإضافات عند الطلب (عند أول استخدام) بدلًا من تحميلها عند بدء التشغيل لتقليل زمن البدء. استخدم sync.Once لكل إضافة لضمان تحميلها مرة واحدة بالضبط.
var mu sync.Mutex
var loaded = map[string]*plugin.Plugin{}
func getPlugin(path string) (*plugin.Plugin, error) {
mu.Lock(); defer mu.Unlock()
if p, ok := loaded[path]; ok { return p, nil }
p, err := plugin.Open(path)
if err != nil { return nil, err }
loaded[path] = p
return p, nil
}اصطلاحات تسمية الرموز
استخدم أسماء CamelCase تبدأ بحرف كبير للرموز المُصدَّرة (إذ تنطبق قاعدة نطاق الرؤية في Go). والاصطلاح الشائع هو Plugin للقيمة الرئيسية أو New لدالة المُنشئ.
معالجة حالات panic في الإضافات
إذا أطلقت إحدى الإضافات panic، فقد تتمكن البرمجية الوسيطة recover في المضيف من اعتراضها، لكن قد تصبح goroutines الخاصة بالإضافة في حالة غير محددة. سجّل الإضافة وتجاوزها، ولا تعاود المحاولة.
التحقق من البيانات الوصفية للإضافة
بعد التحميل، تحقّق من رمز بيانات وصفية (مثل PluginVersion string) للتحقق من التوافق قبل التسجيل:
ver, _ := p.Lookup("PluginVersion")
if *ver.(*string) != expectedVersion { log.Fatal("incompatible") }تحقق سريع
ماذا يحدث إذا استدعيت plugin.Open مرتين باستخدام المسار نفسه؟
مراجعة: التحميل الديناميكي والرموز
النقاط الأساسية:
- يحمّل plugin.Open ملف .so، ويعيد p.Lookup قيمة من النوع any ← أكّد النوع
- حمّل الإضافات من دليل ضمن حلقة تكرار لإنشاء نظام إضافات
- إن plugin.Open دالة متكررة آمنة؛ وتُنفّذ init() مرة واحدة لكل مسار
- فضّل دوال المُنشئ على رموز القيم للحصول على نسخ جديدة
الأسئلة الشائعة
هل درس «التحميل الديناميكي والرموز» مجاني؟
نعم — نص درس «التحميل الديناميكي والرموز» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحميل الديناميكي والرموز»؟
تحميل Plugins وقت التشغيل واستدعاء الرموز المُصدَّرة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التحميل الديناميكي والرموز»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات حزمة Go plugin
- تصميم واجهة Plugin
- التحميل الديناميكي والرموز
- بدائل: HashiCorp go-plugin