أتمتة المهام الروتينية بلغة Go: كتابة سكريبتات تعمل بثبات

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

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

ابدأ الدورة

لماذا Go هي اللغة المثالية للأتمتة؟

\n\n

هل سبق لك أن كتبت سكريبت بلغة Python كان يعمل بشكل رائع على حاسوبك المحمول، لكنه "توقف عن العمل" على الخادم بسبب عدم وجود الإصدار المناسب من المفسر؟ أو ربما تحول سكريبت Bash الخاص بك إلى وحش لا يمكن صيانته عندما أصبحت المنطق أكثر تعقيدًا من مجرد "نسخ ملف"؟

\n\n

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

\n\n

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

\n\n

1. التعامل مع نظام الملفات: تنظيف السجلات كالمحترفين

\n\n

واحدة من أكثر المهام شيوعًا للمسؤول أو المطور هي تنظيف السجلات القديمة. لنكتب أداة تحذف الملفات الأقدم من N يومًا في دليل معين. هذا مثال كلاسيكي على أتمتة المهام بلغة Go.

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n    "time"\n)\n\nfunc main() {\n    // المسار إلى دليل السجلات\n    logDir := "/var/log/myapp"\n    // حذف الملفات الأقدم من 7 أيام\n    maxAge := 7 * 24 * time.Hour\n\n    err := filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n\n        // تخطي المجلدات\n        if info.IsDir() {\n            return nil\n        }\n\n        // التحقق من عمر الملف\n        if time.Since(info.ModTime()) > maxAge {\n            fmt.Printf("جارٍ حذف الملف القديم: %s (العمر: %v)\\n", path, time.Since(info.ModTime()))\n            err := os.Remove(path)\n            if err != nil {\n                fmt.Printf("خطأ في حذف %s: %v\\n", path, err)\n            }\n        }\n        return nil\n    })\n\n    if err != nil {\n        fmt.Printf("خطأ في تجول الدليل: %v\\n", err)\n    }\n}\n
\n\n

هذا الكود هو مثال ممتاز على كيفية أتمتة المهام بلغة Go دون الحاجة لمكتبات إضافية. الحزمة المضمنة filepath تجوب المجلدات بشكل متكرر، و os.Remove ينظف المساحة. بمجرد تجميعه مرة واحدة، تحصل على ملف ثنائي يمكن تشغيله عبر cron على أي خادم.

\n\n

2. طلبات HTTP وتحليل API

\n\n

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

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "sync"\n    "time"\n)\n\nfunc checkURL(url string, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    client := http.Client{\n        Timeout: 5 * time.Second,\n    }\n\n    resp, err := client.Get(url)\n    if err != nil {\n        fmt.Printf("[فشل] %s - %v\\n", url, err)\n        return\n    }\n    defer resp.Body.Close()\n\n    if resp.StatusCode != http.StatusOK {\n        fmt.Printf("[تحذير] %s - الحالة: %d\\n", url, resp.StatusCode)\n    } else {\n        fmt.Printf("[ناجح]   %s - يعمل\\n", url)\n    }\n}\n\nfunc main() {\n    urls := []string{\n        "https://google.com",\n        "https://github.com",\n        "https://pythonlib.ru",\n        "https://non-existent-site.xyz",\n    }\n\n    var wg sync.WaitGroup\n\n    for _, url := range urls {\n        wg.Add(1)\n        go checkURL(url, &wg) // تشغيل في goroutine\n    }\n\n    wg.Wait() // انتظار انتهاء جميع goroutines\n    fmt.Println("اكتمل الفحص.")\n}\n
\n\n

لاحظ استخدام s

المدونات

توصيات الكتب