Junior — Middle
Przy przekazywaniu danych do funkcji: co jest bardziej wydajne pod względem wykorzystania pamięci — tablica czy wycinek?
sobes.tech AI
Odpowiedź od AI
W języku Go tablice mają stały rozmiar i są przechowywane w całości w pamięci, podczas gdy slices to struktury zawierające wskaźnik na tablicę, długość i pojemność.
Z punktu widzenia wykorzystania pamięci:
- Tablica: zajmuje dokładnie tyle pamięci, ile elementów, rozmiar jest znany na etapie kompilacji.
- Slice: sam w sobie zajmuje niewiele pamięci (trzy słowa: wskaźnik, długość, pojemność), ale wskazuje na tablicę, która przechowuje dane.
Przy przekazywaniu do funkcji:
- Jeśli przekażesz tablicę, jest ona kopiowana w całości, co może być kosztowne pod względem pamięci i czasu przy dużych rozmiarach.
- Jeśli przekażesz slice, kopiowana jest tylko struktura slice (wskaźnik + długość + pojemność), a dane pozostają w oryginalnej tablicy, więc nie dochodzi do kopiowania danych.
Dlatego przekazywanie slice jest bardziej efektywne pod względem wykorzystania pamięci i wydajności, szczególnie dla dużych zbiorów danych.
Przykład:
func processArray(arr [1000]int) {
// kopiuje cały array
}
func processSlice(s []int) {
// kopiuje tylko strukturę slice
}
func main() {
var a [1000]int
processArray(a) // kosztowne
processSlice(a[:]) // efektywne
}