首页  >  文章  >  后端开发  >  为什么在 Go 中修改函数内部的数组也会更改分配给函数外部同一数组的变量?

为什么在 Go 中修改函数内部的数组也会更改分配给函数外部同一数组的变量?

Susan Sarandon
Susan Sarandon原创
2024-10-26 01:25:28706浏览

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

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

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