لماذا يثير استيراد الحزم المحلية في Go الكثير من الأسئلة؟
\n\nإذا كنت قد حاولت يومًا تنظيم كود Go في ملفات ومجلدات منفصلة، فمن المحتمل أنك واجهت خطأ مثل could not import "myproject/utils". هذه واحدة من أكثر المشكلات شيوعًا بين مطوري Go المبتدئين. على Stack Overflow، حصد سؤال "How to import local packages in go?" آلاف المشاهدات - وليس بدون سبب.
على عكس Python، حيث يكفي وضع ملف بجانب آخر وكتابة import mymodule، يتطلب Go هيكلًا واضحًا وإعدادًا صحيحًا للوحدات. ولكن بمجرد إتقان هذه الآلية، ستدرك مدى أناقتها. دعنا نفهمها مرة واحدة وإلى الأبد.
نظرية مختصرة: كيف يفهم Go الحزم
\n\nقبل كتابة الكود، تذكر ثلاثة مبادئ أساسية:
\n\n- \n
- Go هي لغة ذات هيكل وحدات صارم. كل دليل هو حزمة واحدة (package). \n
- اسم الحزمة ليس ملزمًا بأن يتطابق مع اسم المجلد، لكن يُوصى بشدة بذلك لتحسين readability. \n
- استيراد الحزم المحلية منذ عام 2019 يتم عبر الوحدات (Go modules). انسَ
GOPATH- استخدمgo mod. \n
الآن ننتقل إلى التطبيق العملي.
\n\nالخطوة 1: إنشاء مشروع مع وحدة
\n\nافتح terminal وأنشئ مجلدًا جديدًا لمشروعك:
\n\nmkdir go-local-imports\ncd go-local-imports\n\n\nالآن، قم بتهيئة الوحدة. يمكن أن يكون اسم الوحدة أي شيء، لكن من المنطقي استخدام مسار فريد (مثل رابط المستودع):
\n\ngo mod init github.com/your-username/go-local-imports\n\n\nبعد هذا الأمر، سيظهر ملف go.mod في المجلد. هذا الملف سيدير التبعيات - المحلية والخارجية على حد سواء.
الخطوة 2: إنشاء حزمة محلية
\n\nلننشئ مجلد utils داخل المشروع. بداخله، ملف math.go:
mkdir utils\ncd utils\ntouch math.go\n\n\nافتح utils/math.go واكتب:
package utils\n\n// Add ترجع مجموع عددين صحيحين\nfunc Add(a, b int) int {\n return a + b\n}\n\n\nلاحظ: الدالة Add مكتوبة بحرف كبير. في Go، هذا يعني أنها مُصدرة (عامة). إذا كتبت add - فستكون خاصة وغير متاحة من الحزم الأخرى.
الخطوة 3: استيراد واستخدام الحزمة المحلية
\n\nعد إلى المجلد الجذر للمشروع وأنشئ main.go:
cd ..\ntouch main.go\n\n\nمحتوى main.go:
package main\n\nimport (\n "fmt"\n "github.com/your-username/go-local-imports/utils"\n)\n\nfunc main() {\n result := utils.Add(3, 5)\n fmt.Println("المجموع:", result)\n}\n\n\nالآن قم بتشغيل البرنامج:
\n\ngo run main.go\n\n\nيجب أن ترى:
\n\nالمجموع: 8\n\n\nكل شيء يعمل! ولكن إذا حصلت على خطأ - اقرأ القسم التالي.
\n\nالأخطاء النموذجية وحلولها
\n\nالخطأ 1: "package is not in GOROOT"
\n\nترى شيئًا مثل:
\npackage myproject/utils is not in GOROOT (/usr/local/go/src/myproject/utils)\n\nالسبب: تحاول استيراد حزمة بدون وحدة. Go يبحث عنها في المكتبة القياسية، وليس في مشروعك.
\nالحل: تأكد من وجود go.mod في جذر المشروع. إذا لم يكن موجودًا، نفذ go mod init اسم-الوحدة.
الخطأ 2: "undefined: utils.Add"
\n\nالسبب: الدالة مكتوبة بحرف صغير (خاصة)، أو أنك استوردت الحزمة ولكنك لا تستخدم اسمها.
\nالحل: تحقق من أن جميع الدوال المطلوبة مُصدرة (بحرف كبير)، وأنك تشير إليها باستخدام اسم الحزمة.