在 Go 中,切片和数组尽管有相似之处,但具有不同的行为。这种区别会影响它们在分配和作为参数传递时的处理方式。
数组是固定大小的元素集合,每个元素占用一个特定的索引。将一个数组分配给另一个数组会生成所有元素的副本,无论其大小如何。这意味着对分配的数组进行的任何修改都不会影响原始数组。
切片,另一方面,是对底层数组的灵活、动态引用。当您将切片分配给另一个变量时,您正在创建对同一基础数组的引用,而不是副本。对任一切片进行的修改都会影响底层数组,因此也会影响两个引用。
考虑以下 Go 代码:
<code class="go">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 切片,同时保持 arr 完整。但是,由于切片的工作方式,arr 和 arr2 都引用相同的底层数组。因此,当 shuffle() 交换 arr 中的元素时,变化也会反映在 arr2 中。
结果为“1 5 2 4 3”,表示 arr 和 arr2 进行了混洗。这种行为是由于切片(作为引用)和数组(作为固定大小的集合)之间的区别而产生的。在 Go 中使用数组时,了解这一根本区别非常重要。
以上是Go 切片和数组在分配和传递时的处理方式相同吗?的详细内容。更多信息请关注PHP中文网其他相关文章!