mo في Go: دليل شامل مع أمثلة تطبيقية

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

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

ابدأ الدورة

مكتبة mo في Go: الأنماط الوظيفية (Monads)

مرحبًا بك في عالم البرمجة الوظيفية بلغة Go! مكتبة mo (اختصارًا لـ monads) هي أداة قوية تضفي على لغة Go الإجرائية مفاهيم الأنماط الوظيفية الشائعة في لغات مثل Haskell وScala وRust. إذا كنت قد واجهت مشكلة معالجة الأخطاء المتكررة عبر if err != nil، أو الفحوصات المتداخلة اللانهائية على nil، أو سلاسل الاستدعاءات الطويلة، فإن mo تقدم لك حلاً أنيقًا.

الهدف الأساسي للمكتبة هو توفير حاويات آمنة من حيث النوع (Option، Result، Either) تغلف الحالات المحتملة (وجود/غياب قيمة، نجاح/خطأ) وتسمح بالتعامل معها بأسلوب وظيفي. بدلاً من كتابة عشرات العبارات الشرطية، يمكنك بناء سلاسل من التحويلات حيث تتم معالجة كل خطوة تلقائيًا. وهذا يجعل الكود أكثر قابلية للقراءة، وأكثر قابلية للتوقع، وأقل عرضة للأخطاء، خاصة في المنطق التجاري المعقد.

مكتبة mo لا تحاول تحويل Go إلى Haskell. إنها تقدم نهجًا عمليًا: تستخدم الأنماط الوظيفية حيثما يبسط ذلك الكود حقًا، مع الحفاظ على بناء جملة Go المألوف. mo مفيدة بشكل خاص لمعالجة الأخطاء، والعمل مع القيم الاختيارية، وتكوين الدوال، وتنفيذ خطوط أنابيب معالجة البيانات. وهي تتكامل بشكل جيد مع الـ goroutines والـ channels، مما يسمح ببناء برامج متزامنة موثوقة.

التثبيت

يتم تثبيت مكتبة mo بالطريقة القياسية في Go عبر مدير الحزم go get. نفذ الأمر التالي في الطرفية في جذر مشروعك (حيث يوجد ملف go.mod):

go get github.com/samber/mo

بعد تنفيذ هذا الأمر، ستتم إضافة المكتبة إلى ملف go.mod الخاص بك، وستتمكن من استيرادها في ملفات المصدر الخاصة بك. تأكد من أن لديك إصدار Go 1.18 أو أحدث (مطلوب لدعم الـ Generics).

بداية سريعة

لنبدأ بمثال تقليدي: قسمة رقمين بشكل آمن. في Go التقليدية، كنا سنعيد خطأ. مع mo، نستخدم النوع Result، الذي يمكن أن يكون إما Ok (نجاح) أو Err (خطأ).

package main

import (
    "fmt"
    "github.com/samber/mo"
)

// safeDivide ترجع Result يحتوي إما على ناتج القسمة أو خطأ.
func safeDivide(a, b float64) mo.Result[float64] {
    if b == 0 {
        return mo.Err[float64](fmt.Errorf("القسمة على صفر"))
    }
    return mo.Ok(a / b)
}

func main() {
    result := safeDivide(10, 2)

    // نستخدم الدالة Match لمعالجة كلتا الحالتين.
    result.Match(
        func(value float64) {
            fmt.Printf("النتيجة: %.2f\n", value)
        },
        func(err error) {
            fmt.Printf("خطأ: %s\n", err)
        },
    )

    // لنجرب القسمة على صفر.
    result2 := safeDivide(10, 0)
    result2.Match(
        func(value float64) {
            fmt.Printf("النتيجة: %.2f\n", value)
        },
        func(err error) {
            fmt.Printf("خطأ: %s\n", err)
        },
    )
}

يوضح هذا المثال الفكرة الأساسية: بدلاً من التحقق من الخطأ يدويًا، نقوم بتفويض مسؤولية المعالجة إلى المكتبة باستخدام الدالة Match.

الدوال والمكونات الأساسية

فيما يلي المكونات الرئيسية لمكتبة mo. سنستعرض 8 دوال/أنواع أساسية تغطي 90% من احتياجاتك.

1. mo.Ok[T any] و mo.Err[T any]

التوقيع:

  • func Ok[T any](value T) Result[T]
  • func Err[T any](err error) Result[T]

الوظيفة: تنشئان مث

توصيات