Junior
Go-ში slices და arrays შორის ძირითადი განსხვავება რა არის?
sobes.tech AI
პასუხი AI-სგან
სლაისები — ეს დინამიურად ცვალებადი მასივების ხედი არიან.
| მახასიათებელი | მასივი (Array) | სლაისი (Slice) |
|---|---|---|
| ზომა | ფიქსირებული, შექმნის დროს განსაზღვრული | დინამიური, შეიძლება შეიცვალოს |
| ტიპი | [n]T (სადაც n ზომაა, T ტიპი) |
[]T (სადაც T ტიპია) |
| ფუნქციებს შორის გადაცემა | მნიშვნელობით (კოპია) | ქვემოთ არსებული მასივის მითითებით, გადაეცემა head, len და cap (სინამდვილეში, ქმნება ახალი SliceHeader სტრუქტურა ამ სფეროების კოპიებით) |
| შექმნა | var a [5]int ან b := [3]string{"a", "b", "c"} |
var s []int ან t := []int{1, 2, 3} ან u := make([]int, 5) |
| შესრულება | უფრო წინასწარ განსაზღვრული ფიქსირებული ზომის გამო, შეიძლება იყოს უფრო ეფექტიანი მცირე ზომებზე | ზომის ცვლილების დროს შეიძლება ჰქონდეს დამატებითი ხარჯები (ქვემოთ არსებული მასივის გადანაწილება) |
// მასივის მაგალითი
var arr [3]int = [3]int{1, 2, 3}
// მასივიდან შექმნილი სლაისის მაგალითი
slice := arr[1:] // სლაისი {2, 3}
// სლაისის შექმნის მაგალითი
s := []int{10, 20, 30} // ქვემოთ არსებული მასივი {10, 20, 30}, სიგრძე = 3, კაპასიტი = 3
// სლაისის შეცვლა
s = append(s, 40) // ახლა s {10, 20, 30, 40}. თუ კაპასიტი არ არის საკმარისი, შექმნება ახალი ქვემოთ არსებული მასივი, სიგრძე = 4, კაპასიტი = 6 (ჩვეულებრივ ორმაგდება კაპასიტი)
// ელემენტის შეცვლა სლაისში შეცვლის ქვემოთ არსებული მასივს
slice[0] = 99 // arr ახლა {1, 99, 3}
fmt.Println(arr)