首頁  >  文章  >  後端開發  >  為什麼在 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