Senior
Jei dirbu su slice, jį paimu kaip funkcijos parametrą, su juo kažką darau ir po funkcijos tęsiu darbą su juo — į ką turiu atkreipti dėmesį? Kokius pokyčius iš išorės nematysime?
sobes.tech AI
Atsakymas iš AI
Go kalboje, skaidymas (slice) yra struktūra, kuri turi rodyklę į masyvą, ilgį ir talpą. Kai perduodate skaidymą į funkciją, kopijuojama tik ši struktūra (rodyklė, ilgis, talpa), ne pats masyvas.
Svarbu prisiminti:
- Pakeitimai skaidymo elementuose funkcijos viduje (pvz.,
s[0] = 10) bus matomi išorėje, nes jie nurodo tą patį masyvą. - Pakeitimai pačioje skaidymo struktūroje (pvz., priskyrimas naujam skaidymui
s = append(s, 5)) neturės įtakos skaidymui už funkcijos ribų, nes kopijuojama tik struktūra.
Pavyzdys:
func modify(s []int) {
s[0] = 100 // pakeis masyvo elementą — matyti išorėje
s = append(s, 200) // keičia vietinę kopiją — nematyti išorėje
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Išves [100 2 3], pridėjimas 200 neatsispindės
Trumpai tariant, pakeitimai skaidymo elementuose matomi išorėje, o pakeitimai ilgį ar talpą (per append, slices) — ne, jei negrąžinate naujo skaidymo arba nepersiunčiate rodyklės į skaidymą.