Middle
Podle jakého algoritmu se zvyšuje velikost řezu (slice) v Go?
sobes.tech AI
Odpověď od AI
Zvětšení velikosti řezu v Go probíhá podle následujícího algoritmu při použití funkce append():
- Určí se požadovaná kapacita (capacity) nového řezu.
- Pokud je současná kapacita dostatečná pro umístění nových prvků (
cap(s) >= len(s) + len(elements)), prvky jsou jednoduše přidány na konec aktuálního základního pole a nový řez ukazuje na tuto oblast. - Pokud současná kapacita nestačí, alokuje se nové základní pole s větší kapacitou. Algoritmus pro určení této nové kapacity je následující:
- Pokud je požadovaná kapacita větší než dvojnásobek staré (
requiredCap > 2 * oldCap), je nová kapacita rovna požadované. - Pokud je stará kapacita menší než 1024 (
oldCap < 1024), kapacita se zdvojnásobí (newCap = oldCap * 2). - Pokud je stará kapacita větší nebo rovna 1024 (
oldCap >= 1024), kapacita se zvýší o 25% (newCap = oldCap + oldCap/4) až do dosažení nebo překročení požadované.
- Pokud je požadovaná kapacita větší než dvojnásobek staré (
- Prvky ze starého základního pole jsou zkopírovány do nového.
- Nové prvky jsou přidány na konec nového základního pole.
- Nová kapacita může být mírně větší než vypočtená hodnota kvůli zarovnání paměti.
- Funkce
append()vrací nový řez ukazující na nové základní pole.
Navíc může být starý řez a jeho základní pole odstraněno garbage collectorem, pokud na ně již nejsou odkazy.