Sobes.tech
Senior

Als ik met een slice werk, het als parameter van een functie neem, er iets mee doe en daarna verder ga met werken — waar moet ik aan denken? Welke veranderingen zullen we niet van buitenaf zien?

sobes.tech AI

Antwoord van AI

In Go is een slice een structuur die een pointer naar een array, een lengte en een capaciteit bevat. Wanneer je een slice doorgeeft aan een functie, wordt alleen deze structuur (pointer, lengte, capaciteit) gekopieerd, niet de array zelf.

Wat belangrijk is om te onthouden:

  • Wijzigingen aan de elementen van de slice binnen de functie (bijvoorbeeld s[0] = 10) zijn zichtbaar van buitenaf, omdat ze naar dezelfde array wijzen.
  • Wijzigingen aan de structuur van de slice zelf (bijvoorbeeld het toewijzen van een nieuwe slice s = append(s, 5)) zullen geen effect hebben op de slice buiten de functie, omdat alleen de structuur wordt gekopieerd.

Voorbeeld:

func modify(s []int) {
    s[0] = 100       // wijzigt het element van de array — zichtbaar van buitenaf
    s = append(s, 200) // wijzigt de lokale kopie van de slice — niet zichtbaar van buitenaf
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Print [100 2 3], het toevoegen van 200 wordt niet weergegeven

Kortom, wijzigingen aan de elementen van de slice zijn zichtbaar van buitenaf, maar wijzigingen in de lengte of capaciteit (via append, slices) niet, tenzij je een nieuwe slice retourneert of een pointer naar de slice doorgeeft.