Go 中的数组处理
在 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)
}
}
作者对为什么 arr2 受到 shuffle 函数的影响表示困惑,尽管他们期望 arr2 和 arr 是不同的实体。
澄清
这个问题源于数组和切片之间的误解。
数组 vs切片
数组是固定长度的值集合,而切片是对底层数组的动态引用。在提供的代码示例中,未使用数组。
Slice Manipulation
arr := []int{1, 2, 3, 4, 5} 行创建一个引用匿名底层数组的切片。随后的 arr2 := arr 行只是复制此引用,导致 arr 和 arr2 都指向同一个底层数组。
函数行为
当将 arr 传递给shuffle 函数时,会创建切片的副本,而不是底层数组。该副本由函数修改,这就是为什么 arr 被修改时 arr2 也会受到影响。
结论
在 Go 中,切片表现为对底层数组的引用。将一个切片分配给另一个切片会复制引用,而不是底层数组。这个概念对于理解 Go 中的切片操作至关重要。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3