Middle
Jakim algorytmem zwiększa się rozmiar wycinka (slice) w Go?
sobes.tech AI
Odpowiedź od AI
Zwiększanie rozmiaru zakresu w Go odbywa się zgodnie z następującym algorytmem podczas korzystania z funkcji append():
- Określa się wymaganą pojemność (capacity) nowego zakresu.
- Jeśli obecna pojemność jest wystarczająca do pomieszczenia nowych elementów (
cap(s) >= len(s) + len(elements)), elementy są po prostu dodawane na koniec obecnej podstawowej tablicy, a nowy zakres wskazuje na ten obszar. - Jeśli obecna pojemność jest niewystarczająca, alokowana jest nowa podstawowa tablica z większą pojemnością. Algorytm określania nowej pojemności jest następujący:
- Jeśli wymagana pojemność jest większa niż dwukrotność starej (
requiredCap > 2 * oldCap), nowa pojemność jest równa wymaganej. - Jeśli stara pojemność jest mniejsza niż 1024 (
oldCap < 1024), pojemność jest podwajana (newCap = oldCap * 2). - Jeśli stara pojemność jest większa lub równa 1024 (
oldCap >= 1024), pojemność zwiększa się o 25% (newCap = oldCap + oldCap/4) aż do osiągnięcia lub przekroczenia wymaganej.
- Jeśli wymagana pojemność jest większa niż dwukrotność starej (
- Elementy starej podstawowej tablicy są kopiowane do nowej.
- Nowe elementy są dodawane na koniec nowej podstawowej tablicy.
- Nowa pojemność może być nieco większa od obliczonej wartości ze względu na wyrównanie pamięci.
- Funkcja
append()zwraca nowy zakres wskazujący na nową podstawową tablicę.
Ponadto, stary zakres i jego podstawowa tablica mogą zostać usunięte przez garbage collector, jeśli nie ma na nie więcej odwołań.