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