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中文网其他相关文章!