Sobes.tech
Junior — Middle

Jakie dane wewnątrz slice'a są przekazywane podczas wywoływania funkcji z tym slice'em jako argumentem?

sobes.tech AI

Odpowiedź od AI

W Go, zakres (slice) to struktura zawierająca trzy pola: wskaźnik na tablicę, długość i pojemność. Przy przekazywaniu zakresu do funkcji, kopiowana jest tylko ta struktura, a nie cały tablica danych.

To znaczy, że podczas wywołania funkcji, zakres jest przekazywany przez wartość, ale kopiowane są tylko metadane (wskaźnik, długość, pojemność), a nie same elementy tablicy. Oznacza to, że wewnątrz funkcji zakres wskazuje na ten sam podstawowy tablica, i zmiany elementów zakresu wewnątrz funkcji będą widoczne na zewnątrz.

Przykład:

func modify(slice []int) {
    slice[0] = 100 // zmienia pierwszy element
}

func main() {
    s := []int{1, 2, 3}
    modify(s)
    fmt.Println(s) // wyświetli [100 2 3]
}

W związku z tym, podczas przekazywania zakresu do funkcji, kopiowane są tylko trzy pola struktury zakresu, a dane tablicy pozostają wspólne.