برشها (Slices)
برشهای انعطافپذیر Go: append، copy، make، len/cap و تفاوت با آرایه.
برش (Slice) چیست؟
Slice مهمترین و پرکاربردترین کالکشن Go است — مانند آرایه اما با طول انعطافپذیر. Slice در واقع یک «پنجره» روی یک آرایه زیرین است.
تعریف Slice
// با لیترال (رایجترین)
numbers := []int{1, 2, 3}
// از آرایه موجود
arr := [5]int{10, 20, 30, 40, 50}
s := arr[1:4] ← [20 30 40]
// خالی
var empty []int ← nil (طول ۰)
// با make (طول و ظرفیت مشخص)
s2 := make([]int, 5) ← [0 0 0 0 0]
s3 := make([]int, 3, 10) ← طول ۳، ظرفیت ۱۰
تفاوت کلیدی:
[]int (بدون عدد) = Slice، [5]int (با عدد) = آرایه!append — افزودن عنصر
s := []int{1, 2, 3}
s = append(s, 4) ← [1 2 3 4]
s = append(s, 5, 6) ← [1 2 3 4 5 6]
s = append(s, []int{7, 8}...) ← اضافه کردن slice دیگر
نتیجه
append را حتماً به خود slice برگردانید: s = append(s, x) — ممکن است آرایه جدیدی ساخته شود!len و cap
s := make([]int, 3, 10)
fmt.Println(len(s)) ← 3 (تعداد عناصر فعلی)
fmt.Println(cap(s)) ← 10 (ظرفیت قبل از تخصیص مجدد)
برش زدن (Slicing)
s := []int{10, 20, 30, 40, 50}
fmt.Println(s[1:3]) ← [20 30] (از ۱ تا ۳، شامل ۳ نمیشود)
fmt.Println(s[:2]) ← [10 20] (از اول)
fmt.Println(s[2:]) ← [30 40 50] (تا آخر)
fmt.Println(s[:]) ← کل
copy — کپی کردن
src := []int{1, 2, 3, 4, 5}
dst := make([]int, 3)
n := copy(dst, src) ← n = 3 (تا جایی که جا شود)
fmt.Println(dst) ← [1 2 3]
حذف عنصر
Go تابع آماده حذف ندارد — با append میسازیم:
s := []int{1, 2, 3, 4, 5}
i := 2 ← حذف عنصر سوم
s = append(s[:i], s[i+1:]...) ← [1 2 4 5]
پیمایش
for i, v := range s {
fmt.Println(i, v)
}
چرا Slice بهتر از Array؟
| ویژگی | Array | Slice |
|---|---|---|
| طول | ثابت | انعطافپذیر |
| انتقال به تابع | کپی کل | مرجع (سبک) |
| نوع | طول بخشی از نوع | مستقل از طول |
این مبحث بخشی از دوره آموزش کامل گو است.