Why does shuffling a slice affect a slice assigned to it in Go?

Patricia Arquette
Release: 2024-10-27 03:57:03
Original
986 people have browsed it

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>
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!