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.