首页  >  文章  >  后端开发  >  为什么在 Go 中打乱切片会影响分配给它的切片?

为什么在 Go 中打乱切片会影响分配给它的切片?

Patricia Arquette
Patricia Arquette原创
2024-10-27 03:57:03987浏览

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

Go 中的数组处理

在 Go 中,数组是值类型,将一个数组分配给另一个数组会创建其所有元素的副本。即使将数组传递给函数时也是如此,因为它将收到副本而不是内存引用。

原始问题

提出了有关以下代码:

<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 受到 shuffle 函数的影响表示困惑,尽管他们期望 arr2 和 arr 是不同的实体。

澄清

问题源于数组和切片之间的误解。

数组与切片

数组是固定长度的值集合,而切片是对底层数组的动态引用。在提供的代码示例中,没有使用数组。

切片操作

arr := []int{1, 2, 3, 4, 5} 行创建一个引用匿名底层数组的切片。随后的 arr2 := arr 行只是复制此引用,导致 arr 和 arr2 都指向同一个底层数组。

函数行为

当将 arr 传递给shuffle 函数时,会创建切片的副本,而不是底层数组。这个副本是由函数修改的,这就是为什么 arr 被修改时 arr2 也会受到影响。

结论

在 Go 中,切片的行为就像对底层数组的引用。将一个切片分配给另一个切片会复制引用,而不是底层数组。这个概念对于理解 Go 中的切片操作至关重要。

以上是为什么在 Go 中打乱切片会影响分配给它的切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

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