Home >Backend Development >Golang >Why does shuffling a slice affect a slice assigned to it in Go?
Array Handling in Go
In Go, arrays are value types, and assigning one array to another creates a copy of all its elements. This holds true even when passing an array to a function, as it will receive a copy rather than a memory reference.
Original Question
A query was raised regarding the following code:
<code class="go">package main import ( "fmt" "rand" "time" ) func shuffle(arr []int) { rand.Seed(time.Nanoseconds()) for i := len(arr) - 1; i > 0; i-- { j := rand.Intn(i) arr[i], arr[j] = arr[j], arr[i] } } func main() { arr := []int{1, 2, 3, 4, 5} arr2 := arr shuffle(arr) for _, i := range arr2 { fmt.Printf("%d ", i) } }</code>
The author expressed confusion as to why arr2 was affected by the shuffle function, despite their expectation of arr2 and arr being distinct entities.
Clarification
The issue stems from a misunderstanding between arrays and slices.
Arrays vs Slices
Arrays are fixed-length collections of values, while slices are dynamic references to underlying arrays. In the provided code example, no arrays are used.
Slice Manipulation
The arr := []int{1, 2, 3, 4, 5} line creates a slice referencing an anonymous underlying array. The subsequent arr2 := arr line simply duplicates this reference, resulting in both arr and arr2 pointing to the same underlying array.
Function Behavior
When passing arr to the shuffle function, a copy of the slice is created, not the underlying array. This copy is modified by the function, which is why arr2 is also affected when arr is modified.
Conclusion
In Go, slices behave as references to underlying arrays. Assigning one slice to another copies the reference, not the underlying array. This concept is crucial for understanding slice manipulation in Go.
The above is the detailed content of Why does shuffling a slice affect a slice assigned to it in Go?. For more information, please follow other related articles on the PHP Chinese website!