هل Go مناسبة لهياكل البيانات والخوارزميات؟
نعم. تُصرَّف إلى شيفرة أصلية سريعة، وصياغتها صغيرة بما يكفي لتكون الخوارزمية معظم ما تقرؤه، والأنواع العامة (منذ Go 1.18) تجعل مكدساً أو كومة ذات أنواع محددة قابلة لإعادة الاستخدام. والمقابل مكتبة قياسية مقتضبة: فيما عدا الـ slices والـ maps وcontainer/list وcontainer/heap، تكتب الهياكل بنفسك، وهذا بالضبط المقصود في مسار تعليمي. كما أن Go تشغّل جزءاً كبيراً من البنية التحتية السحابية اليوم، ومنها Docker وKubernetes، ما يجعلها لغة طبيعية للمقابلات في وظائف الـ backend.
أي أنواع وحزم Go تقابل أي هياكل بيانات؟
الـ slice مصفوفة ديناميكية، وهي مع append وإعادة التقطيع مكدسك أيضاً؛ والـ map جدول تجزئة، وmap[T]struct{} هي الطريقة المعتادة لتمثيل المجموعة؛ وcontainer/list قائمة مترابطة مزدوجة؛ وcontainer/heap تشغّل كومة ثنائية فوق أي نوع ينفّذ heap.Interface. ولا يوجد نوع للطابور ولا للشجرة ولا لشجرة البادئات ولا للرسم البياني، لذا تبنيها بنفسك في الخطوتين الأولى والثانية.
كيف تعمل container/heap في Go؟
تنفّذ heap.Interface على نوع slice خاص بك: الدوال Len وLess وSwap من sort.Interface، إضافة إلى Push وPop اللتين تكتفيان بالإضافة إلى نهاية الـ slice والحذف منها. ثم تستدعي دالتي الحزمة heap.Push وheap.Pop، لا دوالّك أنت أبداً، فتتوليان تحريك العناصر صعوداً وهبوطاً للحفاظ على الترتيب. تبدو هذه الطريقة غريبة إلى أن تكتب كومة بنفسك، وهذا ما تفعله في الخطوة الثانية.
لماذا يعطي المرور على map في Go ترتيباً مختلفاً في كل مرة؟
لأن Go تجعل ترتيب المرور على الـ map عشوائياً عن قصد، كي لا يعتمد عليه أي برنامج. فجدول التجزئة لا ترتيب ذا معنى له في أي لغة؛ وGo تتأكد فقط من أنك تلاحظ ذلك. وحين يهم الترتيب، كما في مخرجات يقارنها اختبار، اجمع المفاتيح في slice ورتّبها، أو احتفظ بـ slice إلى جانب الـ map.
ما الدورات في هذا المسار التي لا تُدرَّس بلغة Go؟
ثلاث دورات. البرمجة الديناميكية وسلسلة مقابلات Python تُدرَّسان بلغة Python، وعمليات البتات بلغة C++. وتجدها مُدرجة بعد الخطوات، ولكل منها رابط يفتحها بلغتها. جدول النتائج المحفوظة في Go يكون slice أو map، وتضيف Go معاملاً للبتات لا يوجد في C++: &^، أي AND NOT، الذي يصفّر في معامَله الأيسر كل بت قيمته 1 في معامَله الأيمن.
هل أحتاج إلى معرفة Go قبل بدء هذا المسار؟
البُنى (structs) والمؤشرات والـ slices والـ maps والدوال (methods) على الأقل؛ والأنواع العامة تفيد، ويمكنك اكتسابها في الطريق. إن كانت هذه جديدة عليك، فدورة Go من Coddy توصلك إلى ذلك أولاً مجاناً، ويبدأ هذا المسار من حيث تنتهي.