لماذا Go هي اللغة المثالية للأتمتة؟
\n\nهل سبق لك أن كتبت سكريبت بلغة Python كان يعمل بشكل رائع على حاسوبك المحمول، لكنه "توقف عن العمل" على الخادم بسبب عدم وجود الإصدار المناسب من المفسر؟ أو ربما تحول سكريبت Bash الخاص بك إلى وحش لا يمكن صيانته عندما أصبحت المنطق أكثر تعقيدًا من مجرد "نسخ ملف"؟
\n\nإذا كان الأمر كذلك، فعليك إلقاء نظرة على Go. تم إنشاء هذه اللغة في أعماق Google خصيصًا لحل المشكلات التي يواجهها المهندسون عند كتابة الأدوات والخدمات. يتم تجميعها في ملف ثنائي واحد (لا تبعيات!)، وتعمل بسرعة فائقة، ولها بناء جملة بسيط لكنه قوي.
\n\nفي هذه المقالة، لن نعلمك أساسيات بناء الجملة. سننتقل مباشرة إلى صلب الموضوع: أتمتة المهام بلغة Go مع أمثلة كود حقيقية. ستتعلم كيفية كتابة أول "سكريبتات Go" الخاصة بك، والتي ستعمل بشكل أكثر موثوقية وأسرع من نظيراتها بلغة Python. هيا بنا!
\n\n1. التعامل مع نظام الملفات: تنظيف السجلات كالمحترفين
\n\nواحدة من أكثر المهام شيوعًا للمسؤول أو المطور هي تنظيف السجلات القديمة. لنكتب أداة تحذف الملفات الأقدم من N يومًا في دليل معين. هذا مثال كلاسيكي على أتمتة المهام بلغة Go.
\n\npackage 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 على أي خادم.
2. طلبات HTTP وتحليل API
\n\nلنفترض أنك بحاجة إلى مراقبة حالة عدة خدمات مصغرة أو تحليل بيانات من API خارجي. Go مع goroutines الخاصة بها تتعامل مع هذا ببراعة. لنكتب سكريبت يتحقق من توفر المواقع ويرسل إشعارًا إذا سقط شيء. هذا مثال قوي آخر على أتمتة المهام بلغة Golang.
\n\npackage 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