首页  >  文章  >  后端开发  >  为什么打乱一个切片会影响引用同一底层数组的另一个切片?

为什么打乱一个切片会影响引用同一底层数组的另一个切片?

Susan Sarandon
Susan Sarandon原创
2024-10-26 22:44:02251浏览

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

了解 Go 中的数组处理

http://golang.org/doc/ effective_go.html#arrays 中的文档强调了数组基于值的性质Go,将一个数组分配给另一个数组会创建所有元素的副本。这一原则也适用于函数参数,其中函数接收数组的副本,而不是指针。

基于此信息,人们会期望以下代码在 arr2 和 arr 中生成不同的数组main() 函数:

<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>

但是,代码意外地也对 arr2 进行了洗牌。这种行为源于这样一个事实:所提供的代码对切片进行操作,而不是对数组进行操作。

切片:对数组的引用

Go 使用切片作为处理值序列的更灵活、更高效的方式。切片是对底层数组的引用,将一个切片分配给另一个切片只会重复该引用。

在示例代码中, arr := []int{1, 2, 3, 4, 5} 行创建了一个引用匿名底层整数数组的切片。当执行 arr2 := arr 时,它会创建一个新切片,该切片也引用相同的底层数组。

数组处理的含义

由于 arr 和 arr2 都引用相同的底层数组,因此修改 arr shuffle() 函数中也会影响 arr2。此行为符合将一个切片分配给另一个切片的原则,只需复制引用,而不是创建底层数组的新副本。

因此,代码正确地对 arr 和 arr2 进行洗牌,因为它们都引用相同的底层整数数组。

以上是为什么打乱一个切片会影响引用同一底层数组的另一个切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn