Sobes.tech
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ą.