A slice is a small struct containing three fields: a pointer to the underlying array, the length, and the capacity. When you pass a slice to a function, only this small header is copied, not the data.
Multiple slices can share the same underlying array. Changes through one slice are visible through the other. This sharing is efficient but requires care to avoid unexpected modifications.