Junior
Jaka jest kluczowa różnica między slices a tablicami w Go?
sobes.tech AI
Odpowiedź od AI
Slicery to widoki na tablice, które mogą się dynamicznie zmieniać.
| Charakterystyka | Tablica (Array) | Slicery (Slice) |
|---|---|---|
| Rozmiar | Stały, określany podczas tworzenia | Dynamiczny, może się zmieniać |
| Typ | [n]T (gdzie n to rozmiar, T to typ) |
[]T (gdzie T to typ) |
| Przekazywanie do funkcji | Przez wartość (kopię) | Przez referencję do tablicy bazowej, przekazywane head, len i cap (w rzeczywistości tworzona jest nowa struktura SliceHeader z kopiami tych pól) |
| Tworzenie | var a [5]int lub b := [3]string{"a", "b", "c"} |
var s []int lub t := []int{1, 2, 3} lub u := make([]int, 5) |
| Wydajność | Bardziej przewidywalna ze względu na stały rozmiar, może być korzystniejsza przy małych rozmiarach | Może mieć narzuty przy zmianie rozmiaru (przealokacja tablicy bazowej) |
// Przykład tablicy
var arr [3]int = [3]int{1, 2, 3}
// Przykład slice utworzonego z tablicy
slice := arr[1:] // slice {2, 3}
// Przykład tworzenia slice
s := []int{10, 20, 30} // tablica bazowa {10, 20, 30}, długość = 3, pojemność = 3
// Modyfikacja slice
s = append(s, 40) // teraz s {10, 20, 30, 40}. Jeśli brakuje miejsca, tworzona jest nowa tablica bazowa, długość = 4, pojemność = 6 (zwykle podwajanie pojemności).
// Modyfikacja elementu slice zmienia tablicę bazową
slice[0] = 99 // arr teraz {1, 99, 3}
fmt.Println(arr)