Sobes.tech
Middle

Čo sa stane, ak do zoznamu pridáme príliš veľa prvkov vo vnútri funkcie?

sobes.tech AI

Odpoveď od AI

V jazyku Go je slice štruktúra, ktorá obsahuje ukazovateľ na pole, dĺžku a kapacitu. Ak pridáte príliš veľa prvkov do slice, prekročíte jeho aktuálnu kapacitu, Go automaticky pridelení nový väčší pole a skopíruje do neho dáta.

To znamená, že pri pridávaní prvkov sa môže slice preusporiadať, čo spôsobí dodatočné náklady na čas a pamäť. Ak pridávate prvky do slice v rámci funkcie bez vrátenia nového slice, zmeny nemusia byť zachované, pretože slice sa odovzdáva hodnotou (struktúra sa kopíruje, ale nie dáta).

Príklad:

func appendElements(s []int) {
    for i := 0; i < 1000; i++ {
        s = append(s, i) // pri prekročení kapacity sa vytvorí nový slice
    }
}

// Aby sa zmeny zachovali, je potrebné vrátiť slice:
func appendElementsCorrect(s []int) []int {
    for i := 0; i < 1000; i++ {
        s = append(s, i)
    }
    return s
}

Pri pridávaní veľkého množstva prvkov je dôležité brať do úvahy redistribúciu pamäti a správne pracovať s vrátenou hodnotou slice.