المصفوفة (array) لها حجم ثابت يكون جزءاً من نوعها؛ القطعة (slice) هي عرض مرن وديناميكي لمصفوفة أساسية. عملياً تستخدم القطع دائماً تقريباً — المصفوفات نادرة جداً في Go اليومي.
المصفوفات — حجم ثابت
arr []
arr[] =
fmt.Println((arr))
المصفوفة (array) لها حجم ثابت يكون جزءاً من نوعها؛ القطعة (slice) هي عرض مرن وديناميكي لمصفوفة أساسية. عملياً تستخدم القطع دائماً تقريباً — المصفوفات نادرة جداً في Go اليومي.
arr []
arr[] =
fmt.Println((arr))
حجم المصفوفة ثابت في وقت الترجمة وجزء من نوعها ([5]int ≠ [3]int). المصفوفات أيضاً أنواع قيمة — تعيين أو تمرير واحدة ينسخ المصفوفة كاملة. هذه الصرامة هي السبب في ندرة استخدامها بشكل مباشر.
s := []int{1, 2, 3} // a slice (no size in the brackets)
s = append(s, 4) // grow it — append returns a new slice
fmt.Println(len(s), cap(s)) // length and capacity
nums := make([]int, 0, 10) // make a slice: length 0, capacity 10 (pre-allocated)
القطعة ليس لها حجم ثابت — تنموها باستخدام append. إنها أداة التسلسل الديناميكي الأساسية.
A slice is a small struct: { pointer to underlying array, length, capacity }
- len = number of elements currently in the slice
- cap = size of the underlying array from the slice's start
append: if len < cap, reuses the array; if len == cap, allocates a BIGGER array & copies
original := []int{1, 2, 3, 4, 5}
sub := original[1:3] // [2, 3] — a VIEW into the same backing array
sub[0] = 99 // ⚠️ also changes original[1] → [1, 99, 3, 4, 5]!
القطع (s[low:high]) لا ينسخ — بل ينشئ رأس قطعة جديد يشير إلى نفس المصفوفة الأساسية. تعديل واحدة قد يؤثر على الأخرى — مصدر شائع للأخطاء الدقيقة. استخدم copy() للحصول على نسخة مستقلة.
a := []int{1, 2, 3}
b := append(a, 4) // may or may not share a's array depending on capacity
// safe pattern: always use the RETURNED slice from append
a = append(a, 4)
القطع هي واحدة من أكثر الميزات استخداماً وأسوأ فهماً في Go.
فهم أن المصفوفات أنواع قيمة بحجم ثابت (نادراً ما تُستخدم بشكل مباشر) بينما القطع هي عروض مرنة وشبيهة بالمراجع لمصفوفة أساسية (الأداة اليومية) أمر أساسي.
es الأهمية، معرفة السلوك المشترك للمصفوفة الأساسية — أن القطع تنشئ عرضاً وليس نسخة، لذا التعديلات قد تؤثر على قطع أخرى، وأن append قد تعيد التخصيص أم لا — يمنع فئة من أخطاء aliasing الدقيقة والصعبة في التصحيح التي تحتر حتى المطورين ذوي الخبرة.
إتقان القطع (len مقابل cap، append، copy، فخاخ المشاركة) معرفة يومية أساسية في Go وموضوع متكرر في المقابلات، لأن جميع عمل المجموعات تقريباً يستخدمها.