Junior
Mis on peamine erine slices ja massiivide vahel Go keeles?
sobes.tech AI
Vastus AI-lt
Slaidid on dünaamiliselt muudetavad massiivide vaated.
| Omadus | Massiiv (Array) | Slaid (Slice) |
|---|---|---|
| Suurus | Fikseeritud, määratakse loomisel | Dünaamiline, võib muutuda |
| Tüüp | [n]T (kus n on suurus, T on tüüp) |
[]T (kus T on tüüp) |
| Funktsioonidele edastamine | Väärtusena (koopia) | Viitega underlying array'ile, edastatakse head, len ja cap (tegelikult luuakse uus SliceHeader struktuur nende väljade koopiatega) |
| Loomine | var a [5]int või b := [3]string{"a", "b", "c"} |
var s []int või t := []int{1, 2, 3} või u := make([]int, 5) |
| Tõhusus | Enamasti etteaimatav jõudlus fikseeritud suuruse tõttu, võib väikeste suuruste puhul võita | Võib põhjustada lisakulusid suuruse muutmisel (underlying array'i ümbermääramine) |
// Näide massiivist
var arr [3]int = [3]int{1, 2, 3}
// Näide slaidist, mis on loodud massiivist
slice := arr[1:] // slaid {2, 3}
// Näide slaidi loomisest
s := []int{10, 20, 30} // underlying array {10, 20, 30}, len = 3, cap = 3
// Slaidi muutmine
s = append(s, 40) // nüüd s {10, 20, 30, 40}. Kui cap ei mahu, luuakse uus underlying array, len = 4, cap = 6 (tavaliselt kahekordistub cap).
// Slaidi elemendi muutmine muudab underlying array'd
slice[0] = 99 // arr nüüd {1, 99, 3}
fmt.Println(arr)