Sobes.tech
Senior

Ako radim sa slice-om, uzmem ga kao parametar funkcije, nešto s njim uradim i nastavim da radim s njim nakon funkcije — na šta treba da obratim pažnju? Koje promene nećemo videti spolja?

sobes.tech АИ

Одговор од АИ

U Go-u, slice je struktura koja sadrži pokazivač na niz, dužinu i kapacitet. Kada prosledite slice funkciji, kopira se samo ova struktura (pokazivač, dužina, kapacitet), a ne sam niz.

Važno je zapamtiti:

  • Promene na elementima slice-a unutar funkcije (npr., s[0] = 10) biće vidljive spolja, jer ukazuju na isti niz.
  • Promene same strukture slice-a (npr., dodeljivanje novog slice-a s = append(s, 5)) neće uticati na slice izvan funkcije, jer se kopira samo struktura.

Primer:

func modify(s []int) {
    s[0] = 100       // promeniće element niza — biće vidljivo spolja
    s = append(s, 200) // menja lokalnu kopiju slice-a — spolja neće biti vidljivo
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Ispisaće [100 2 3], dodavanje 200 neće biti reflektovano

Ukratko, promene na elementima slice-a su vidljive spolja, dok promene dužine ili kapaciteta (kroz append, slices) nisu, osim ako ne vratite novi slice ili ne prosledite pokazivač na slice.