Junior
Kuo skiriasi slices ir arrays Go kalboje?
sobes.tech AI
Atsakymas iš AI
Sklai yra dinamiškai keičiamų masyvų vaizdai.
| Savybė | Masyvas (Array) | Sklai (Slice) |
|---|---|---|
| Dydis | Fiksuotas, nustatomas kuriant | Dinamiškas, gali keistis |
| Tipas | [n]T (kur n yra dydis, T tipas) |
[]T (kur T yra tipas) |
| Perdavimas funkcijoms | Pagal reikšmę (kopiją) | Pagal nuorodą į pagrindinį masyvą, perduodami head, len ir cap (iš tikrųjų, sukuriama nauja SliceHeader struktūra su šių laukų kopijomis) |
| Kūrimas | var a [5]int arba b := [3]string{"a", "b", "c"} |
var s []int arba t := []int{1, 2, 3} arba u := make([]int, 5) |
| Veikimas | Daugiau prognozuojamas dėl fiksuoto dydžio, gali būti efektyvesnis mažų dydžių atvejais | Gali turėti papildomų išlaidų keičiant dydį (perkėlimas į naują pagrindinį masyvą) |
// Masyvo pavyzdys
var arr [3]int = [3]int{1, 2, 3}
// Iš masyvo sukurtas sklaidas pavyzdys
slice := arr[1:] // sklaidas {2, 3}
// Sklaido sukūrimo pavyzdys
s := []int{10, 20, 30} // pagrindinis masyvas {10, 20, 30}, ilgis = 3, talpa = 3
// Sklaido keitimas
s = append(s, 40) // dabar s {10, 20, 30, 40}. Jei talpa nėra pakankama, sukuriamas naujas pagrindinis masyvas, ilgis = 4, talpa = 6 (dažniausiai dvigubinant talpą)
// Elemento keitimas sklaidoje keičia pagrindinį masyvą
slice[0] = 99 // arr dabar {1, 99, 3}
fmt.Println(arr)