Middle
Kokiu algoritmu didėja Go kalboje iškarpos (slice) dydis?
sobes.tech AI
Atsakymas iš AI
Didinant segmentą Go vyksta pagal šį algoritmą naudojant append() funkciją:
- Nustatomas naujo segmento reikalingas talpa (capacity).
- Jei esama talpa yra pakankama naujiems elementams (
cap(s) >= len(s) + len(elements)), elementai paprastai pridedami prie esamo pagrindinio masyvo pabaigos, o naujas segmentas rodo į šią sritį. - Jei esama talpa nėra pakankama, paskiriamas naujas pagrindinis masyvas su didesne talpa. Algoritmas, kaip nustatyti šią naują talpą:
- Jei reikalinga talpa yra didesnė nei dvigubai sena (
requiredCap > 2 * oldCap), nauja talpa yra lygi reikalingai. - Jei sena talpa yra mažesnė nei 1024 (
oldCap < 1024), talpa dvigubinama (newCap = oldCap * 2). - Jei sena talpa yra lygi arba didesnė nei 1024 (
oldCap >= 1024), talpa padidinama 25% (newCap = oldCap + oldCap/4) iki kol ji pasieks arba viršys reikalingą.
- Jei reikalinga talpa yra didesnė nei dvigubai sena (
- Elementai iš seno pagrindinio masyvo kopijuojami į naują.
- Nauji elementai pridedami prie naujo pagrindinio masyvo pabaigos.
- Nauja talpa gali būti šiek tiek didesnė už apskaičiuotą reikšmę dėl atminties išlyginimo.
append()funkcija grąžina naują segmentą, rodančią į naują pagrindinį masyvą.
Be to, senas segmentas ir jo pagrindinis masyvas gali būti pašalinti iš šiukšlių surinkėjo, jei jiems daugiau nėra nuorodų.