Slice

Slice در واقع همان آرایه است با این تفاوت که در زمان تعریف برای آن طول تعیین نمی کنیم. این کار باعث قدرت و انعطاف بیشتر می شود. در زیر روش های ایجاد Slice ذکر شده اند:

make([]Type, length, capacity)

make([]Type, length)

[]Type{}

[]Type{value1, value2, ..., valueN}

همانطور که در درس قبل ذکر شد آرایه ها دارای طول ثابتی هستند و بعد از تعریف نمی توان مقداری به آنها اضافه کرد. ولی Slice ها این مشکل را برطرف کرده اند. به مثال زیر توجه کنید:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func main() {
  6:     var numbers = [] int { 10, 15, 17, 20, 13}
  7: 
  8:     numbers = append(numbers, 6)
  9: 
 10:     fmt.Println(numbers)
 11: }
[1 2 3 4 5 6]

در خط 6 کد بالا، یک Slice تعریف کرده ایم و در خط 8 به راحتی مقدار 6 را به آن اضافه کرده ایم. Slice دارای متدهای مختلفی جهت حذف، اضافه، تکه تکه کردن و … عناصر را می دهند. یکی از آنها متد ()append است که در کد از آن برای اضافه کردن یک عنصر به Slice استفاده کرده ایم. روش دیگر برای ایجاد Slice استفاده از متد ()make است. این متد سه پارامتر می گیرد. اولین پارامتر نوع داده هایی که Slice قرار است بگیرد، دومی طول و سومی ظرفیت Slice می باشد. به کد زیر توجه کنید:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func main() {
  6:     numbers := make([]int, 5)
  7: 
  8:     numbers[0] = 10
  9:     numbers[1] = 15
 10:     numbers[2] = 17
 11:     numbers[3] = 20
 12:     numbers[4] = 13
 13: 
 14:     fmt.Println(numbers)
 15: }
[10 15 17 20 13]

در کد بالا یک Slice به نام numbers و با طول 5 تعریف کرده ایم. حال اگر بخواهیم، می توانیم با استفاده از کد زیر یک عنصر دیگر به ین Slice اضافه کنیم:

numbers = append(numbers, 50)

اما یک نکته، در خط 6 کد بالا، ما طول Slice را مشخص کرده ایم. حال تکلیف پارامتر سوم یا ظرفیت Slice چه می شود و اصلا تفاوت این دو با هم چیست؟ به مثال زیر توجه کنید:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func main() {
  6:     var arrayOfCharacter = [11] string { "s","l","i","c","e"," ","t","h","i","s","!" }
  7: 
  8:     sliceOfCharacter := arrayOfCharacter[6:8]
  9: 
 10:     fmt.Println("Capacity of array :", cap(arrayOfCharacter))
 11:     fmt.Println("Lenght   of array :", cap(arrayOfCharacter))
 12:     fmt.Println()
 13:     fmt.Println("Capacity of slice :", cap(sliceOfCharacter))
 14:     fmt.Println("Lenght   of slice :", len(sliceOfCharacter))
 15: }
Capacity of array : 11
Lenght   of array : 11

Capacity of slice : 7
Lenght   of slice : 3

در خط 6 کد بالا، ما یک آرایه به طول 11 کاراکتر ایجاد کرده ایم. یعنی تعداد عناصر آرایه 11 می باشد. در خط 8 یک برش یا Slice از این آرایه ایجاد کرده ایم. [4:7] در خط 11 بدین معنی است که از عنصری که دارای اندیس 6 تا عنصری که دارای اندیس 7 است را برش بزن. یعنی کاراکتر های t و h را جدا کن و در داخل یک Slice به نام sliceOfCharacter قرار بده. حال در خطوط 14-10 با استفاده از دو متد ()len و ()cap طول و ظرفیت آرایه و Slice را به دست آورده ایم. طول و ظرفیت آرایه به هم برابرند. یعنی تعداد عناصر آرایه مشخص کننده طول و ظرفیت آرایه است. اما در Slice وضع بدین منوال نیست. طول Slice تعداد عناصر Slice، که در مثال بالا 2 عنصر هستند، ولی ظرفیت Slice از جاییکه برش آرایه شروع شده است تا پایان آرایه می باشد یعنی 5. برای درک بهتر به شکل زیر توجه کنید: