الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 2 من 517/50 في الدورة~15 min
دروس الوحدة (2/5)

الشرائح: البنية الاصطلاحية

الشريحة هي بنية البيانات الأكثر استخدامًا في Go: عرض ديناميكي على مجموعة الأساسية. بناء الجملة: []T. على عكس المصفوفات، الطول هو ليس جزءًا من النوع، ويمكنك تنميته باستخدام append.

تشريح شريحة

داخليًا، الشريحة عبارة عن بنية ثلاثية المجالات:

  • مؤشر للعنصر الأول في المصفوفة الأساسية
  • الطول (len): عدد العناصر المرئية
  • السعة (cap): العناصر المتاحة من بداية العرض إلى نهاية المصفوفة الأساسية
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

الخلق

Go
a := []int{1, 2, 3}          // literal
b := make([]int, 3)          // [0 0 0]   len=3 cap=3
c := make([]int, 3, 10)      // len=3 cap=10 (reserved)
var d []int                  // nil slice: len=0 cap=0, still usable with append

append: قم دائمًا بتعيين النتيجة

append يضيف عناصر ويعيد شريحة جديدة (من المحتمل تخصيص مصفوفة جديدة إذا كانت السعة غير كافية):

Go
s := []int{1, 2, 3}
s = append(s, 4)              // [1 2 3 4]
s = append(s, 5, 6, 7)        // append multiple elements
s = append(s, altra...)       // concatenate another slice (spread)

تعبير الشريحة s[a:b]

استخراج شريحة فرعية من a (شاملاً) إلى b (حصريًا):

Go
s := []int{10, 20, 30, 40, 50}
sub := s[1:4]              // [20 30 40]
inizio := s[:2]            // [10 20]
fine := s[3:]              // [40 50]
intera := s[:]             // [10 20 30 40 50]

الشرائح الفرعية تشارك المصفوفة الأساسية مع الشريحة الأصلية: الطفرات خلال sub[i] = ... مرئية في s أيضًا.

المأزق: مشاركة المصفوفة

Go
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s)             // [99 2 3 4] — modified!

للحصول على نسخة مستقلة، استخدم copy أو append:

Go
out := make([]int, len(sub))
copy(out, sub)

جربه

تمرين#go.m4.l2.e1
المحاولات: 0جارٍ التحميل…

أنشئ شريحة باستخدام [1، 2، 3] واستخدم الإلحاق لإضافة 4.

جارٍ تحميل المحرر…
إظهار التلميح

قم دائمًا بتعيين نتيجة الإلحاق مرة أخرى إلى `s`.

الحل متاح بعد 3 من المحاولات

تمرين#go.m4.l2.e2
المحاولات: 0جارٍ التحميل…

استخدم تعبير شريحة لاستخراج العناصر من الفهرس 1 شاملاً إلى 3 حصريًا (أي [20، 30]).

جارٍ تحميل المحرر…
إظهار التلميح

بناء الجملة: s[start:end]`، `start` شامل، `end` حصريًا.

الحل متاح بعد 3 من المحاولات

Quiz#go.m4.l2.e3
جاهز

أي من هذه الأشياء خاطئة في الكتابة؟

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
خيارات الإجابة

خلاصة

  • []T: عرض ديناميكي على مصفوفة؛ ثلاثية (ptr، len، cap).
  • make([]T, len, cap) للتخصيص المسبق؛ var s []T للحصول على شريحة صالحة للاستخدام.
  • s = append(s, ...): قم دائمًا بتعيين النتيجة.
  • s[a:b] يشارك المصفوفة الأساسية: copy(...) للنسخ المستقلة.
  • شريحة nil = موافق للقراءة/النطاق/الإلحاق؛ مختلفة تمامًا عن الخريطة الصفرية.