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) } }
在此代码中,shuffle 函数将数组作为输入并对其元素进行洗牌。然而,即使我们在调用 shuffle 之前将原始数组分配给新变量 arr2,函数内对 arr 所做的更改也会反映在 arr2 中。
切片与数组
Go 区分了切片和数组。数组是固定长度的值列表,而切片是对底层数组的引用。在代码示例中,arr 和 arr2 都引用相同的底层数组。因此,对 arr 所做的任何修改也将应用于 arr2。要创建数组的不同副本,必须使用 make 分配切片:
arr := []int{1, 2, 3, 4, 5} arr2 := make([]int, len(arr)) copy(arr2, arr)
在此更新版本中,arr2 不再是对原始数组的引用,因此对 arr 所做的修改不会影响arr2.
以上是为什么在 Go 中修改函数内部的数组也会更改分配给函数外部同一数组的变量?的详细内容。更多信息请关注PHP中文网其他相关文章!