Sobes.tech
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():

  1. Určí se požadovaná kapacita (capacity) nového řezu.
  2. 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.
  3. 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é.
  4. Prvky ze starého základního pole jsou zkopírovány do nového.
  5. Nové prvky jsou přidány na konec nového základního pole.
  6. Nová kapacita může být mírně větší než vypočtená hodnota kvůli zarovnání paměti.
  7. 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.