Middle
Akým algoritmom sa zvyšuje veľkosť rezu (slice) v Go?
sobes.tech AI
Odpoveď od AI
Zväčšenie veľkosti rezu v Go prebieha podľa nasledujúceho algoritmu pri použití funkcie append():
- Určí sa požadovaná kapacita (capacity) nového rezu.
- Ak je súčasná kapacita dostatočná na umiestnenie nových prvkov (
cap(s) >= len(s) + len(elements)), prvky sa jednoducho pridajú na koniec aktuálneho základného poľa a nový rez ukazuje na túto oblasť. - Ak súčasná kapacita nestačí, alokuje sa nové základné pole s väčšou kapacitou. Algoritmus na určenie tejto novej kapacity je nasledovný:
- Ak je požadovaná kapacita väčšia ako dvojnásobok starej (
requiredCap > 2 * oldCap), nová kapacita je rovná požadovanej. - Ak je stará kapacita menšia ako 1024 (
oldCap < 1024), kapacita sa zdvojnásobí (newCap = oldCap * 2). - Ak je stará kapacita väčšia alebo rovná 1024 (
oldCap >= 1024), kapacita sa zvýši o 25% (newCap = oldCap + oldCap/4) až do dosiahnutia alebo prekročenia požadovanej.
- Ak je požadovaná kapacita väčšia ako dvojnásobok starej (
- Prvky zo starého základného poľa sa skopírujú do nového.
- Nové prvky sa pridajú na koniec nového základného poľa.
- Nová kapacita môže byť mierne väčšia ako vypočítaná hodnota kvôli zarovnaniu pamäte.
- Funkcia
append()vráti nový rez, ktorý ukazuje na nový základný pole.
Okrem toho, starý rez a jeho základné pole môžu byť odstránené garbage collectorom, ak na ne už nie sú odkazy.