Sobes.tech
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)