برش‌ها (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؟

ویژگیArraySlice
طولثابتانعطاف‌پذیر
انتقال به تابعکپی کلمرجع (سبک)
نوعطول بخشی از نوعمستقل از طول

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط