دروس الوحدة (2/5)
الشرائح: البنية الاصطلاحية
الشريحة هي بنية البيانات الأكثر استخدامًا في Go: عرض ديناميكي
على مجموعة الأساسية. بناء الجملة: []T. على عكس المصفوفات، الطول هو
ليس جزءًا من النوع، ويمكنك تنميته باستخدام append.
تشريح شريحة
داخليًا، الشريحة عبارة عن بنية ثلاثية المجالات:
- مؤشر للعنصر الأول في المصفوفة الأساسية
- الطول (
len): عدد العناصر المرئية - السعة (
cap): العناصر المتاحة من بداية العرض إلى نهاية المصفوفة الأساسية
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3الخلق
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 appendappend: قم دائمًا بتعيين النتيجة
append يضيف عناصر ويعيد شريحة جديدة (من المحتمل
تخصيص مصفوفة جديدة إذا كانت السعة غير كافية):
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 (حصريًا):
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 أيضًا.
المأزق: مشاركة المصفوفة
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!للحصول على نسخة مستقلة، استخدم copy أو append:
out := make([]int, len(sub))
copy(out, sub)جربه
أنشئ شريحة باستخدام [1، 2، 3] واستخدم الإلحاق لإضافة 4.
إظهار التلميح
قم دائمًا بتعيين نتيجة الإلحاق مرة أخرى إلى `s`.
الحل متاح بعد 3 من المحاولات
استخدم تعبير شريحة لاستخراج العناصر من الفهرس 1 شاملاً إلى 3 حصريًا (أي [20، 30]).
إظهار التلميح
بناء الجملة: s[start:end]`، `start` شامل، `end` حصريًا.
الحل متاح بعد 3 من المحاولات
أي من هذه الأشياء خاطئة في الكتابة؟
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= موافق للقراءة/النطاق/الإلحاق؛ مختلفة تمامًا عن الخريطة الصفرية.