تثبيت Go وتجهيز بيئة عمل منتجة
تعليمات تثبيت Go الرسمية متاحة هنا.
بيئة Go
وحدات Go (Modules)
أضافت Go 1.11 الوحدات، وهي وضع البناء الافتراضي منذ Go 1.16، لذلك لا يُنصح باستخدام GOPATH.
تحل الوحدات مشكلات إدارة الاعتماديات (dependencies) واختيار الإصدارات والبناء القابل للتكرار (reproducible builds)، كما أنها تتيح تشغيل كود Go خارج GOPATH.
قليل من السياق: ماذا كان قبل الوحدات؟ قبل Go 1.11، كانت أدوات Go تعتمد على قاعدة اسمها GOPATH، وهو متغير بيئة يشير إلى مجلد واحد على جهازك (عادة ~/go) يجب أن يعيش داخله كل كود Go. كل مشروع وكل اعتمادية وكل حزمة مترجَمة كانت تُخزَّن تحت ذلك المجلد. أي أنك لم تكن تستطيع إنشاء مجلد في أي مكان والبدء في كتابة Go، لأن المترجم لن يعرف كيف يحل الـ imports خارج GOPATH.
كيف تعالج الوحدات كل مشكلة من هذه؟ لإدارة الاعتماديات، يعلن ملف go.mod داخل مشروعك صراحةً عن الحزم الخارجية التي يحتاجها كودك وإصداراتها، بشكل مشابه لـ package.json في Node.js. لاختيار الإصدار، تستخدم Go خوارزمية محددة اسمها Minimum Version Selection (MVS): عندما تحتاج عدة اعتماديات إلى إصدارات مختلفة من الحزمة نفسها، تختار Go دائمًا أقل إصدار يرضي الجميع، فتصبح النتيجة متوقعة. وللبناء القابل للتكرار، تولّد Go ملف go.sum بجوار go.mod يحتوي على بصمة تشفيرية (hash) لكل اعتمادية. أي شخص يبني المشروع سينزّل الملفات نفسها بالضبط، ويتحقق منها عبر تلك البصمات. وإذا تغيّر أي شيء على الخادم، يفشل البناء فورًا.
لماذا تتيح الوحدات الكود خارج GOPATH؟ عندما تجد Go ملف go.mod في مجلد، يصبح هذا الملف مرتكز المشروع. تستخدمه الأدوات لحل كل الـ imports نسبةً إلى تلك الوحدة، دون أي حاجة إلى GOPATH عام. أي أنه يمكنك إنشاء مجلد مشروع في أي مكان على جهازك وسيفهمه المترجم.
استخدام الوحدات مباشر جدًا. اختر أي مجلد خارج GOPATH ليكون جذر مشروعك، وأنشئ وحدة جديدة بأمر go mod init.
سيُولَّد ملف go.mod يحتوي على مسار الوحدة، وإصدار Go، ومتطلبات الاعتماديات، وهي الوحدات الأخرى اللازمة لبناء ناجح.
إذا لم تحدد <modulepath>، ستحاول go mod init تخمين مسار الوحدة من بنية المجلدات. ويمكنك أيضًا تجاوز ذلك بتمريره كوسيط (argument).
mkdir my-project
cd my-project
go mod init <modulepath>وربما يبدو ملف go.mod هكذا:
module cmd
go 1.24إصدار Go المكتوب هنا ليس مجرد معلومة: إذ تستخدمه الأدوات لتحديد القواعد اللغوية المطبَّقة، حتى لو كان لديك إصدار أحدث من Go مثبت. على سبيل المثال، غيّرت Go 1.22 طريقة عمل متغيرات حلقة for، لذا فالكود الذي يعتمد على ذلك السلوك (كما سنرى لاحقًا في فصل concurrency) يحتاج ملف go.mod مكتوبًا فيه 1.22 أو أحدث ليتصرف كما هو متوقع. والحفاظ على هذا الإصدار محدثًا بشكل معقول سيوفر عليك كثيرًا من التصحيح المُحيّر لاحقًا.
ويقدم التوثيق المدمج نظرة عامة على كل أوامر go mod المتاحة.
go help mod
go help mod initفحص الكود (Linting)
يمكنك تحسين الفاحص الافتراضي باستخدام GolangCI-Lint.
ويمكن تثبيته هكذا:
brew install golangci-lintإعادة الهيكلة وأدواتك
تحظى إعادة الهيكلة (refactoring) بأهمية كبيرة في هذا الكتاب.
ويمكن لأدواتك أن تساعدك على القيام بإعادة هيكلة أكبر بثقة.
ينبغي أن تكون معتادًا على محرّرك (editor) بما يكفي لتنفيذ ما يلي بمجموعة مفاتيح بسيطة:
- استخراج/دمج متغير (Extract/Inline variable). إعطاء القيم المعنوية اسمًا واضحًا يبسّط كودك بسرعة.
- استخراج دالة (Extract method/function). من الضروري أن تستطيع أخذ جزء من الكود وتحويله إلى دوال مستقلة.
- إعادة التسمية (Rename). ينبغي أن تستطيع تغيير اسم أي رمز (symbol) في كل الملفات بثقة.
- go fmt. تمتلك Go مُنسّقًا (formatter) صارمًا اسمه
go fmt. ينبغي أن يشغّله محرّرك مع كل عملية حفظ. - تشغيل الاختبارات. ينبغي أن تستطيع فعل أي مما سبق ثم إعادة تشغيل اختباراتك بسرعة للتأكد أن إعادة الهيكلة لم تكسر شيئًا.
وبالإضافة إلى ذلك، ولمساعدتك في العمل على كودك، ينبغي أن تستطيع:
- عرض توقيع الدالة (function signature). لا ينبغي أن تتردد أبدًا في كيفية استدعاء دالة في Go. من المفترض أن يصف لك الـ IDE الدالة من حيث توثيقها وبارامتراتها وما تُرجعه.
- عرض تعريف الدالة (function definition). إذا لم يكن واضحًا ما تفعله الدالة، ينبغي أن تستطيع الانتقال إلى الكود المصدري وفهمه بنفسك.
- إيجاد أماكن استخدام رمز (Find usages). فهم سياق الدالة يساعدك على اتخاذ قرارات أفضل عند إعادة الهيكلة.
إتقان أدواتك سيساعدك على التركيز في الكود وتقليل التنقل بين المهام.
الخلاصة
من المفترض الآن أن يكون لديك Go مثبتًا، ومحرّرًا جاهزًا، وبعض الأدوات الأساسية في مكانها. تمتلك Go نظامًا ضخمًا من المنتجات الخارجية، وقد ذكرنا هنا بعض المكوّنات المفيدة. وللاطلاع على القائمة الكاملة، راجع https://awesome-go.com.