عادةً ما نحتاج إلى استخدام دوال خارجية أخرى في البرنامج، هذه الدوال تكون ضمن حزم خارجية بناها آخرون أو بنيناها بأنفسنا لتقسيم البرنامج إلى عدة ملفات بهدف جعل البرنامج أبسط وأقل تعقيدًا وأكثر أناقةً وقابليةً للفهم.
تُمثّل الحزمة مجلدًا يحتوي على ملف أو عدة ملفات، هذه الملفات هي شيفرات جو قد تتضمن دوال أو أنواع بيانات أو واجهات يمكنك استخدامها في برنامجك الأساسي، وسنتحدث في هذا المقال عن تثبيت الحزم واستيرادها وتسميتها.
حزمة المكتبة القياسية
تُعَدّ المكتبة القياسية التي تأتي مع جو مجموعةً من الحزم، إذ تحتوي هذه الحزم على العديد من اللبنات الأساسية لكتابة البرامج المتطورة في لغة جو، فتحتوي الحزمة fmt
مثلًا على العديد من الدوال التي تُسهّل عمليات تنسيق وطباعة السلاسل النصية، كما تحتوي حزمة net/http
على دوال تسمح للمطوّر بإنشاء خدمات ويب وإرسال واسترداد البيانات عبر بروتوكول http إضافةً للعديد من الأمور الأخرى.
يجب عليك أولًا استيراد هذه الحزمة باستخدام التعليمة import
متبوعة باسم الحزمة للاستفادة من الدوال الموجودة ضمن أيّ حزمة، فيمكنك مثلًا استيراد الحزمة math/rand
ضمن الملف random.go لتوليد أعداد عشوائية:
import "math/rand"
عند استيراد حزمة ما داخل برنامج تصبح جميع مكوناتها قابلةً للاستخدام داخل هذا البرنامج لكن بفضاء أسماء منفصل namespace، وهذا يعني أنه يجب الوصول إلى كل دالة من الحزمة الخارجية بالاعتماد على تدوين النقطة dot notation، أي package.function
، فللوصول مثلًا إلى الدوال الموجودة في الحزمة السابقة نكتب ()rand.Int
لتوليد عدد صحيح عشوائي أو ()rand.Intn
لتوليد عدد عشوائي بين الصفر والعدد المحدَّد.
سنستخدِم في المثال التالي حلقة for
لتوليد أعداد عشوائية بالاستعانة بالدوال السابقة:
package main import "math/rand" func main() { for i := 0; i < 10; i++ { println(rand.Intn(25)) } }
يكون ناتج الخرج كما يلي:
6 12 22 9 6 18 0 15 6 0
نستورد بدايةً الحزمة math/rand
ثم نستخدِم حلقة تتكرر 10 مرات وفي كل مرة تطبع عدد صحيح بين 0 و 25 بحيث تكون الأعداد الناتجة أقل تمامًا من 25 بما أننا مررنا العدد 25 للدالة ()rand.Intn
، وطبعًا عملية التوليد هي عشوائية، لذا ستحصل على أعداد مختلفة في كل مرة تُنفِّذ فيها هذا المقطع البرمجي.
عند استيراد أكثر من حزمة نضع هذه الحزم بين قوسين ()
بعد الكلمة import
بدلًا من استخدام الكلمة import
من أجل كل حزمة، إذ سيجعل هذا الشيفرة مرتبةً أكثر كما في المثال التالي:
import ( "fmt" "math/rand" )
سنستخدِم الحزمة الجديدة التي استوردناها من أجل تنسيق عملية الطباعة في الشيفرة السابقة:
package main import ( "fmt" "math/rand" ) func main() { for i := 0; i < 10; i++ { fmt.Printf("%d) %d\n", i, rand.Intn(25)) } }
يكون الخرج كما يلي:
0) 6 1) 12 2) 22 3) 9 4) 6 5) 18 6) 0 7) 15 8) 6 9) 0
تعلّمت في هذا القسم كيفية استيراد الحزم واستخدامها لكتابة برنامج أكثر تعقيدًا، لكن لم نستخدِم إلا الحزم الموجودة في المكتبة القياسية، وفيما يلي سنرى كيفية تثبيت واستخدام الحزم التي كتبها مطورون آخرون.
تثبيت الحزم
تحتوي المكتبة القياسية على العديد من الحزم الهامة والمفيدة لكنها لأغراض عامة، لذا يُنشئ المطورون حزمًا خاصةً بهم فوق المكتبة القياسية لتلبية احتياجاتهم الخاصة.
تتضمن أدوات جو الأمر go get
الذي يسمح بتثبيت حزم خارجية ضمن بيئة التطوير المحلية الخاصة بك واستخدامها في برنامجك، وعند استخدام هذا الأمر تُشاع الإشارة إلى الحزمة من خلال مسارها الأساسي، كما يمكن أن يكون هذا المسار مسارًا إلى مشروع عام مُستضاف في مستودع شيفرات مثل جيت هاب GitHub، فلاستيراد الحزمة flect
مثلًا نكتب:
$ go get github.com/gobuffalo/flect
سيعثر الأمر go get
على هذه الحزمة الموجودة على جيت هاب وسيثبتها في GOPATH$
، إذ ستُثبّت الحزمة في هذا المثال ضمن المجلد:
$GOPATH/src/github.com/gobuffalo/flect
غالبًا ما تُحدَّث الحزم من قِبل مُطوريها لمعالجة الزلات البرمجية أو إضافة ميزات جديدة، وقد ترغب في هذه الحالة باستخدام أحدث إصدار من تلك الحزمة للاستفادة من الميزات الجديدة أو الزلة البرمجية التي عالجوها، إذ يمكنك تحديث حزمة ما باستخدام الراية -u
مع الأمر go get
:
$ go get -u github.com/gobuffalo/flect
سيؤدي هذا الأمر أيضًا إلى تثبيت الحزمة إذا لم تكن موجودةً لديك أساسًا، ويؤدي الأمر go get
دائمًا إلى تثبيت أحدث إصدار من الحزمة المتاحة، لكن قد ترغب في استخدام حزمة سابقة أو قد تكون هناك نسخة سابقة قد حُدّثت وترغب في استخدامها، ففي هذه الحالة ستحتاج إلى استخدام أداة إدارة الحزم مثل Go Modules
، واعتبارًا من الإصدار Go 1.11 اعتُمِدت Go Modules
بوصفها أداة إدارة حزم رسمية لجو.
تسمية الحزم بأسماء بديلة
قد تحتاج إلى تغيير اسم الحزمة التي تستوردها في حال كان لديك حزمة أخرى تحمل الاسم نفسه، ففي هذه الحالة يمكنك استخدام الكلمة alias
لتغيير اسم الحزمة وتجنب تصادم الأسماء وفق الصيغة التالية:
import another_name "package"
سنعدِّل في المثال التالي اسم الحزمة fmt
ضمن ملف random.go ليصبح f
:
package main import ( f "fmt" "math/rand" ) func main() { for i := 0; i < 10; i++ { f.Printf("%d) %d\n", i, rand.Intn(25)) } }
كتبنا f.Printf
في البرنامج السابق بدلًا من fmt.Printf
، وعمومًا لا يُفضَّل في جو استخدام الأسماء البديلة كما في باقي اللغات مثل بايثون لأنه خروج عن النمط الشائع.
عند اللجوء إلى الأسماء البديلة لتجنب حدوث تصادم في الأسماء، يفضَّل إعادة تسمية الحزم المحلية وليس الخارجيّة، فإذا كان لديك مثلًا حزمة أنشأتها اسمها strings
وتريد استخدامها في برنامجك إلى جانب حزمة النظام strings
، فيُفضّل تسمية الحزمة التي أنشأتها أنت وليس حزمة النظام.
تذكَّر دومًا أنّ سهولة القراءة والوضوح في برنامجك أمر مهم، لذا يجب عليك استخدام الأسماء البديلة فقط لجعل الشيفرة أكثر قابليةً للقراءة أو عندما تحتاج إلى تجنب تضارب الأسماء.
تنسيق الحزم
يمكنك فرز الحزم بترتيب معيّن من خلال تنسيق عمليات الاستيراد لجعل شفرتك أكثر اتساقًا ومنع حدوث تغييرات أو إيداعات عشوائية random commits عندما يكون الشيء الوحيد الذي يتغير هو ترتيب فرز عمليات الاستيراد، فمنع الإيداعات العشوائية سيمنع حدوث خلل في التعليمات البرمجية أو ارتباك أثناء مراجعة الشفرة من قِبل الآخرين.
تُنسّق معظم محررات الشيفرات استيراد الحزم تلقائيًا أو يسمحون لك باستخدام الأداة goimports
، إذ يُعَدّ استخدام هذه الأداة أمرًا مفيدًا وشائعًا وممارسةً قياسيةً، فالحفاظ على ترتيب الفرز يدويًا قد يكون مُملًا ومعرّضًا للأخطاء، بالإضافة إلى ذلك، إذا أُجريَت أية تغييرات على التنسيق القياسي لفرز الحزم، فستُحدَّث goimports
لتعكس تلك التغييرات في التنسيق، مما يضمن لك ولشركائك أنه سيكون لديكم تنسيق متسق لكتل الاستيراد، وإليك ما قد تبدو عليه كتلة الاستيراد قبل التنسيق:
import ( "fmt" "os" "github.com/digital/ocean/godo" "github.com/sammy/foo" "math/rand" "github.com/sammy/bar" )
سيكون لديك الآن التنسيق التالي بتشغيل الأداة goimport
-أو في حالة مُحرّر يستخدِم هذه الأداة، فسيؤدي حفظ الملف إلى تشغيله نيابة عنك-:
import ( "fmt" "math/rand" "os" "github.com/sammy/foo" "github.com/sammy/bar" "github.com/digital/ocean/godo" )
لاحظ أنه يُجمِّع حزم المكتبة القياسية أولًا ثم الحزم الخارجية مع فصلها بسطور فارغة مما يجعل من السهل قراءة وفهم الحزم المستخدَمة.
سيؤدي استخدام الأداة goimports
إلى الحفاظ على تنسيق جميع كتل الاستيراد بطريقة مناسبة، ويمنع حدوث ارتباك حول التعليمات البرمجية بين المطورين الذين يعملون على الملفات نفسها.
الخاتمة
تحدّثنا في هذا المقال عن كيفية استيراد حزم المكتبة القياسية وكيفية استيراد وتثبيت الحزم الخارجية باستخدام go get
للاستفادة من محتوياتها، كما تحدّثنا أيضًا عن كيفية تحديث الحزم واستخدام الأسماء البديلة معها، إذ يتيح لنا استخدام الحزم جعل برامجنا أكثر قوةً ومتانةً وقابليةً للصيانة وللاستخدام المتعدِّد من خلال تقسيمه إلى أجزاء مستقلّة.
ترجمة -وبتصرُّف- للمقال Importing Packages in Go لصاحبه Gopher Guides.
اقرأ أيضًا
تم التعديل في بواسطة عبد اللطيف ايمش2
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.