Sobes.tech
Senior

Jeśli pracuję z kawałkiem, biorę go jako parametr funkcji, coś z nim robię i kontynuuję pracę z nim po funkcji — o czym muszę pamiętać? Jakie zmiany nie będą widoczne z zewnątrz?

sobes.tech AI

Odpowiedź od AI

W Go, zakres (slice) to struktura zawierająca wskaźnik na tablicę, długość i pojemność. Gdy przekazujesz zakres do funkcji, kopiowana jest tylko ta struktura (wskaźnik, długość, pojemność), a nie sama tablica.

Co jest ważne do zapamiętania:

  • Zmiany elementów zakresu wewnątrz funkcji (np. s[0] = 10) będą widoczne na zewnątrz, ponieważ wskazują na ten sam tablicę.
  • Zmiany samej struktury zakresu (np. przypisanie nowego zakresu s = append(s, 5)) nie wpłyną na zakres poza funkcją, ponieważ kopiowana jest tylko struktura.

Przykład:

func modify(s []int) {
    s[0] = 100       // zmieni element tablicy — będzie widoczne na zewnątrz
    s = append(s, 200) // zmienia lokalną kopię zakresu — nie będzie widoczne na zewnątrz
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Wypisze [100 2 3], dodanie 200 nie będzie odzwierciedlone

Podsumowując, zmiany elementów zakresu są widoczne na zewnątrz, ale zmiany długości lub pojemności (przez append, slices) — nie, chyba że zwrócisz nowy zakres lub przekażesz wskaźnik na zakres.