Senior
Czym jest slice? Co jest pod maską slice? Jak działa funkcja append?
sobes.tech AI
Odpowiedź od AI
W Go, slice to dynamiczna tablica, która reprezentuje strukturę z trzema polami:
- Wskaźnik na tablicę (tablica podstawowa w pamięci)
- Długość (len) — liczba elementów dostępnych w slice'u
- Pojemność (cap) — maksymalna liczba elementów, które może pomieścić tablica podstawowa od wskaźnika
Za kulisami, slice to mała struktura, mniej więcej tak:
type sliceHeader struct {
Data uintptr // wskaźnik na pierwszy element tablicy
Len int
Cap int
}
Funkcja append dodaje elementy do slice'a. Jeśli długość slice'a jest mniejsza od pojemności, append po prostu zapisuje nowe elementy w tablicy podstawowej i zwiększa długość. Jeśli długość osiągnie pojemność, append przydziela nową tablicę z powiększoną pojemnością (zwykle dwukrotnie), kopiuje stare elementy, dodaje nowe i zwraca nowy slice z zaktualizowanym wskaźnikiem.
Przykład:
s := []int{1, 2, 3}
s = append(s, 4) // jeśli cap(s) > len(s), po prostu doda 4
// jeśli cap(s) == len(s), przydzieli nową tablicę, skopiuje [1,2,3], doda 4
W ten sposób, append może zwrócić nowy slice, i ważne jest, aby przypisać wynik z powrotem.