Go: كيف تنسى "يعمل عندي" وتبدأ في غزو العوالم
\n\nهل سبق لك أن كتبت سكريبت رائع بلغة Python، وأرسلته إلى صديق يستخدم Windows، فرد عليك: "لا يعمل لدي، لم يتم تثبيت Python"؟ مألوف؟ مرحبًا بك في جحيم التبعيات، البيئات الافتراضية، وإصدارات المفسرات. والآن تخيل: كتبت الكود مرة واحدة، ضغطت على زر واحد - وحصلت على ملف ثنائي يعمل على Windows وLinux وmacOS دون الحاجة إلى تثبيت أي شيء. بدون Python، بدون Node، بدون JVM.
\n\nهذا ليس خيالًا. هذا هو التطوير عبر المنصات بلغة Go - اللغة التي صُممت لحل هذه المشكلات تحديدًا. إذا كنت تكتب بلغة Python وقد سئمت من الرقص حول التبعيات، أو إذا كنت تبحث ببساطة عن أداة لإنشاء أدوات مساعدة سريعة وقابلة للنقل - فستصبح Go صديقك الجديد المفضل. في هذه المقالة، لن نضيع وقتك. سنستعرض أمثلة حقيقية، ونعرض الكود، ونخبرك كيف تجعل برنامجك يعمل في أي مكان يوجد به معالج.
\n\nلماذا Go هي الخيار المثالي للتطوير عبر المنصات؟
\n\nفي عالم Golang عبر المنصات، هذه ليست ميزة، بل أساس. على عكس Python التي تتطلب مفسرًا، أو Java التي تحتاج إلى آلة افتراضية، يتم ترجمة Go إلى كود آلة أصلي. هذا يعني أن ملفك الثنائي يحتوي على كل ما هو ضروري للتشغيل: وقت التشغيل، جامع القمامة، والكود الخاص بك. لا مكتبات خارجية، ولا "pip install". قم بالتنزيل والتشغيل.
\n\nلكن الأهم هو الترجمة المتقاطعة Go. أنت تجلس على MacBook، تكتب الكود، ثم بأمر واحد تقوم ببناء ملف تنفيذي لـ Windows، Linux، Raspberry Pi (ARM)، أو حتى لـ FreeBSD القديم. لا تحتاج إلى آلة افتراضية أو Docker للبناء. متغير بيئة واحد - وانتهى الأمر.
\n\nبالنسبة لمطور Python، يبدو هذا كالسحر، لكنه ببساطة Go. دعنا ننتقل إلى التطبيق العملي.
\n\nكتابة أداة مساعدة عبر المنصات بلغة Go
\n\nلنتخيل أننا بحاجة لكتابة برنامج بسيط ولكنه مفيد: سيجمع معلومات عن النظام (نظام التشغيل، البنية، اسم المضيف) ويحفظها في ملف JSON. هذه مهمة كلاسيكية لـ DevOps أو مسؤول النظام. بلغة Python، كنت ستستخدم platform و json، لكن في Go يبدو هذا أكثر أناقة.
الخطوة 1: الهيكل والاستيراد
\n\nأنشئ ملفًا باسم main.go. أول ما سنفعله هو تعريف هيكل البيانات واستخدام الحزم runtime و os للحصول على معلومات النظام. لاحظ: runtime.GOOS و runtime.GOARCH هما ثوابت مدمجة تعرفها Go حتى في مرحلة الترجمة.
package main\n\nimport (\n "encoding/json"\n "fmt"\n "os"\n "runtime"\n)\n\ntype SystemInfo struct {\n OS string `json:"os"`\n Arch string `json:"arch"`\n Hostname string `json:"hostname"`\n GoVersion string `json:"go_version"`\n}\n\nالخطوة 2: جمع المعلومات
\n\nالآن سنكتب دالة تجمع البيانات. سنستخدم os.Hostname() - وهي تعمل عبر المنصات وتعمل على جميع الأنظمة.
func getSystemInfo() (SystemInfo, error) {\n hostname, err := os.Hostname()\n if err != nil {\n return SystemInfo{}, fmt.Errorf("خطأ في الحصول على اسم المضيف: %w", err)\n }\n\n return SystemInfo{\n OS: runtime.GOOS,\n Arch: runtime.GOARCH,\n Hostname: hostname,\n GoVersion: runtime.Version(),\n }, nil\n}\n\nالخطوة 3: الكتابة إلى JSON
\n\nلنكمل برنامجنا: نحصل على المعلومات، ونرمزها إلى JSON، ونكتبها إلى ملف. سنضيف أيضًا معالجة الأخطاء - وهذا أسلوب جيد في التطوير عبر المنصات بلغة Go، لأن مسارات الملفات تختلف بين أنظمة التشغيل المختلفة.
\n\nfunc main() {\n info, err := getSystemInfo()\n if err != nil {\n fmt.Printf("خطأ: %v\\n", err)\n os.Exit(1)\n }\n\n