هياكل البيانات
على الرغم من أن لغة Go تتمتع ببناء جملة بسيط، إلا أنها تحتوي على العديد من هياكل البيانات الأساسية القوية. تعتبر هذه الهياكل اللبنات الأساسية لبرامج Go، وفهم عميق لمبادئ تنفيذها يساعد في كتابة كود أكثر كفاءة. ستقدم هذه المقالة هياكل البيانات الأكثر استخدامًا في Go وتنفيذها الأساسي.
هياكل البيانات الأساسية
slice الشريحة
الشريحة هي هيكل البيانات الأكثر استخدامًا في لغة Go، وهي تجريد وتغليف للمصفوفات. الخصائص الرئيسية:
- حجم ديناميكي: يمكن لطول الشريحة أن ينمو ديناميكيًا
- دلالة المرجع: عند تمرير الشريحة يتم نسخ البنية فقط، وليس المصفوفة الأساسية
- آلية التوسع: عند عدم كفاية السعة يتم التوسع تلقائيًا
يتم تمثيل الشريحة في وقت التشغيل ببنية slice، والتي تحتوي على مؤشر للمصفوفة الأساسية والطول والسعة.
string السلسلة النصية
السلسلة النصية هي واحدة من أنواع البيانات الأساسية في Go، الخصائص الرئيسية:
- عدم القابلية للتغيير: بمجرد إنشاء السلسلة النصية لا يمكن تعديلها
- ترميز UTF-8: عادة ما تمثل نصًا بترميز UTF-8
- أمان القيمة الصفرية: القيمة الصفرية للسلسلة النصية هي السلسلة الفارغة
""، وليسnil
يتم تمثيل السلسلة النصية في وقت التشغيل ببنية stringStruct، والتي تحتوي على مؤشر لمصفوفة البايت والطول.
هياكل البيانات الحاويةية
map الخريطة
الخريطة هي حاوية أزواج مفتاح-قيمة مدمجة في لغة Go، وتُنفذ باستخدام جدول التجزئة في الطبقة السفلية. الخصائص الرئيسية:
- تنفيذ جدول التجزئة: تحديد موقع العناصر بسرعة من خلال دالة التجزئة
- توسع تلقائي: عند ارتفاع عامل الحمل يتم التوسع تلقائيًا
- عدم أمان التزامن: القراءة والكتابة المتزامنة تتطلب آليات تزامن إضافية
يتم تمثيل الخريطة في وقت التشغيل ببنية hmap، والتي تحتوي على مصفوفة الدلاء وبذرة التجزئة وعدد العناصر وحقول أخرى.
syncmap الخريطة المتزامنة
sync.Map هي خريطة آمنة للتزامن توفرها المكتبة القياسية، ومناسبة لسيناريوهات القراءة الكثيرة والكتابة القليلة. الخصائص الرئيسية:
- فصل القراءة والكتابة: استخدام خريطتي read و dirty لتحقيق فصل القراءة والكتابة
- العمليات الذرية: خريطة read تستخدم عمليات ذرية، بدون الحاجة للأقفال
- الترحيل التدريجي: عند وصول عدد miss إلى الحد الأدنى يتم ترقية dirty إلى read
تحقق sync.Map أداءً أفضل من map + mutex في سيناريوهات محددة من خلال استبدال المساحة بالوقت.
هياكل البيانات المتزامنة
channel القناة
القناة هي ممثل نموذجي لفلسفة CSP في لغة Go، وتُستخدم للتواصل بين الكوروتينات. الخصائص الرئيسية:
- تواصل الكوروتينات: تحقيق نقل البيانات بين الكوروتينات من خلال القناة
- آلية التزامن: القناة غير المخزنة يمكن استخدامها لتزامن الكوروتينات
- قائمة انتظار مؤمنة: في الطبقة السفلية هي قائمة انتظار حلقية مؤمنة
يتم تمثيل القناة في وقت التشغيل ببنية hchan، والتي تحتوي على مخزن مؤقت حلقي وقوائم انتظار وحقول أخرى.
select تعدد الإرسال
يمكن لـ select مراقبة حالة قنوات متعددة في نفس الوقت، وتحقيق تعدد الإرسال. الخصائص الرئيسية:
- عدم الحجب: يمكن فحص ما إذا كانت قنوات متعددة متاحة بطريقة غير حاجبة
- الاختيار العشوائي: عندما تكون قنوات متعددة متاحة في نفس الوقت يتم اختيار واحدة عشوائيًا للتنفيذ
- التحكم في المهلة: بالاشتراك مع
time.Afterلتحقيق آلية المهلة
يتم تمثيل select في وقت التشغيل ببنية scase لكل فرع، ويتم فحص حالة القناة من خلال آلية الاقتراع.
اقتراحات التعلم
يُنصح بالتعلم بالترتيب التالي:
- أولاً تعلم slice الشريحة و string السلسلة النصية، لفهم هياكل البيانات الأساسية
- ثم تعلم map الخريطة، لفهم تنفيذ جدول التجزئة
- بعد ذلك تعلم channel القناة، لفهم آلية تواصل الكوروتينات
- ثم تعلم select تعدد الإرسال، لإتقان تقنيات تعدد الإرسال
- أخيرًا تعلم syncmap الخريطة المتزامنة، لفهم طريقة تنفيذ الأمان للتزامن
