البرمجة التفاعلية في Go (Golang): المكتبات، الأنماط والأمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة التفاعلية في Go (Golang)



البرمجة التفاعلية هي نموذج يركز على تدفقات البيانات غير المتزامنة ونشر التغييرات. في لغة Go (Golang)، يجد هذا المفهوم تطبيقًا طبيعيًا بفضل goroutines المدمجة والقنوات. ومع ذلك، بالنسبة للسيناريوهات المعقدة، توجد مكتبات متخصصة توفر أدوات قوية للعمل مع التدفقات التفاعلية.



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



المفاهيم الأساسية للبرمجة التفاعلية



قبل الانتقال إلى الأدوات، من المهم فهم المصطلحات الرئيسية:



  • Observable — مصدر بيانات يمكنه توليد الأحداث.
  • Observer — مشترك يستجيب للأحداث.
  • المشغلات (Operators) — دوال لتحويل وتصفية ودمج التدفقات (map, filter, merge, flatMap).
  • الضغط العكسي (Backpressure) — آلية للتحكم في سرعة نقل البيانات بين المنتج والمستهلك.


مكتبة RxGo (Reactive Extensions for Go)



RxGo هي أشهر تطبيق للإضافات التفاعلية للغة Go. تقوم بنقل مفاهيم RxJava/RxJS مع تكييفها مع خصائص اللغة (goroutines، عدم وجود الوراثة).



التثبيت:

go get github.com/reactivex/rxgo/v2


مثال: Observable أساسي

package main

import ( "fmt" "github.com/reactivex/rxgo/v2")

func main() { // إنشاء Observable من قائمة observable := rxgo.Just(1, 2, 3, 4, 5)()

// الاشتراك وعرض العناصر ch := observable.Observe() for item := range ch { fmt.Println(item.V) }}


مثال: التحويل باستخدام المشغلات

package main

import ( "fmt" "github.com/reactivex/rxgo/v2")

func main() { observable := rxgo.Just(1, 2, 3, 4, 5)(). Map(func(item rxgo.Item) rxgo.Item { val := item.V.(int) return rxgo.Of(val * 2) }). Filter(func(item rxgo.Item) bool { return item.V.(int) > 5 })

for item := range observable.Observe() { fmt.Println(item.V) // الإخراج: 6, 8, 10 }}


مكتبة go-reactive



go-reactive هي بديل خفيف الوزن لـ RxGo، تركز على البساطة والأداء. تستخدم قنوات Go كأساس للتدفقات التفاعلية.



التثبيت:

go get github.com/teivah/go-reactive


مثال: تدفق تفاعلي مع القنوات

package main

import ( "fmt" "github.com/teivah/go-reactive")

func main() { // إنشاء تدفق أرقام stream := reactive.FromSlice([]int{10, 20, 30, 40, 50})

// تطبيق المشغلات result := stream. Filter(func(i int) bool { return i > 20 }). Map(func(i int) int { return i * 3 })

// الحصول على النتيجة for v := range result.Out() { fmt.Println(v) // الإخراج: 90, 120, 150 }}


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



تتيح Go تنفيذ الأنماط التفاعلية دون مكتبات خارجية باستخدام goroutines والقنوات. هذا مفيد بشكل خاص للسيناريوهات البسيطة.



مثال: نمط Observer باستخدام القنوات

package main

import ( "fmt" "time")

type Event struct { Data string}

// Subject — الكائن المرصودfunc Subject(out chan<- Event) { for i := 0; i < 5; i++ { out <- Event{Data: fmt.Sprintf("Event #%d", i)} time.Sleep(100 * time.Millisecond) } close(out)}

// Observer — المراقبfunc Ob

توصيات