تسلسل الشرائح في Go: أفضل 5 طرق لعام 2025

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تسلسل الشرائح في Go: من المبتدئ إلى المحترف في 2025



الشرائح (slices) في Go هي مصفوفات ديناميكية تشكل قلب معظم تطبيقات Go. عاجلاً أم آجلاً، يواجه كل مطور مهمة: "كيف يمكن دمج شريحتين في شريحة واحدة؟". تبدو عملية بسيطة، ولكن، كما هو الحال مع الكثير في Go، لها مخاطرها الخفية وفروقها الدقيقة في الأداء.



على Stack Overflow، حظي هذا السؤال بآلاف المشاهدات، وليس من دون سبب: يمكن أن يؤدي التسلسل غير الأمثل إلى تخصيصات ذاكرة زائدة وانخفاض سرعة التطبيق. في هذه المقالة، سنستعرض جميع الطرق القانونية لدمج شريحتين، بدءًا من الطريقة الكلاسيكية append وصولاً إلى أحدث إضافات المكتبة القياسية لعام 2025، وسنكتشف أي طريقة تختار حسب الموقف.



لماذا لا تعمل عملية الجمع البسيطة؟



على عكس Python (list1 + list2) أو JavaScript (arr1.concat(arr2))، لا يدعم Go عامل التشغيل + للشرائح. تم ذلك عن قصد: Go هي لغة تتطلب الوضوح. يجب أن تكون كل عملية مع الشرائح شفافة، خاصة فيما يتعلق بإدارة الذاكرة.



دعنا ننتقل مباشرة إلى الموضوع. إليك الطريقة الأبسط والأكثر شيوعًا:



package main

import "fmt"

func main() { slice1 := []int{1, 2, 3} slice2 := []int{4, 5, 6}

// الطريقة رقم 1: append مع فك التغليف result := append(slice1, slice2...) fmt.Println(result) // [1 2 3 4 5 6]}


هذا الكود يعمل، لكن له فارق بسيط. إذا كانت slice1 لديها سعة كافية (cap)، فإن append سيعدلها هي نفسها، بدلاً من إنشاء شريحة جديدة. قد يؤدي هذا إلى آثار جانبية غير متوقعة إذا لم تكن تتوقع تحور الشريحة الأصلية.



التسلسل الآمن عبر make + copy



إذا كنت بحاجة إلى ضمان استقلالية النتيجة عن الشرائح الأصلية، استخدم مزيجًا من make و copy. هذا هو "المعيار الذهبي" لإنشاء شريحة جديدة دون خطر تغيير الأصل.



func concatSlices[T any](a, b []T) []T {    result := make([]T, len(a)+len(b))    copy(result, a)    copy(result[len(a):], b)    return result}

// الاستخدام:combined := concatSlices(slice1, slice2)


لماذا هذا جيد؟

  • قابلية التوقع: أنت دائمًا تنشئ شريحة جديدة. تبقى البيانات الأصلية دون تغيير.
  • التحكم: أنت تخصص الذاكرة بشكل صريح مرة واحدة، بدلاً من الاعتماد على المنطق الداخلي لـ append.
  • الأدوية (Go 1.18+): تعمل الدالة مع أي نوع بيانات.


النهج الحديث: slices.Concat (Go 1.22+)



بدءًا من الإصدار Go 1.22 (الذي أصبح بحلول عام 2025 المعيار السائد منذ فترة طويلة)، ظهرت دالة Concat في الحزمة golang.org/x/exp/slices. في Go 1.22، تم نقلها إلى المكتبة القياسية.



هذه هي الطريقة الرسمية والموصى بها للتسلسل، والتي تجمع بين أمان copy وإيجاز append.



import "slices"

func main() { a := []string{"Go", "Python", "Rust"} b := []string{"JavaScript", "TypeScript"}

combined := slices.Concat(a, b) // combined = ["Go", "Python", "Rust", "JavaScript", "TypeScript"]}


مزايا slices.Concat:

  • قابلية القراءة: الاسم يشرح نفسه بنفسه. يصبح الكود تصريحيًا.
  • التحسين: داخليًا، يتم استخدام تخصيص فعال و copy.
  • المرونة: يمكن تمرير أي عدد من الشرائح: slices.Concat(s1, s2, s3, s4).


إذا كنت تكتب كودًا على Go 1.22+ (وهو الاتجاه السائد في 2025)، فاستخدم slices.Concat بكل ثقة. هذا هو الخيار الأفضل لـ 90% من المهام.



متى لا يزال append مطلوبًا؟



الكلاسيك

المدونات

توصيات الكتب