首頁  >  文章  >  後端開發  >  為什麼打亂一個切片會影響引用同一底層數組的另一個切片?

為什麼打亂一個切片會影響引用同一底層數組的另一個切片?

Susan Sarandon
Susan Sarandon原創
2024-10-26 22:44:02251瀏覽

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

了解Go 中的數組處理

http://golang.org/doc/ effective_go.html#arrays 中的文檔強調了數組基於值的性質Go ,將一個陣列指派給另一個陣列會建立所有元素的副本。這項原則也適用於函數參數,其中函數接收數組的副本,而不是指標。

基於此信息,人們會期望以下程式碼在arr2 和arr 中產生不同的數組main() 函數:

<code class="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)
    }
}</code>

但是,程式碼意外地也對arr2 進行了洗牌。這種行為源於這樣一個事實:所提供的程式碼對切片進行操作,而不是對數組進行操作。

切片:對陣列的引用

Go 使用切片作為處理值序列的更靈活、更有效率的方式。切片是對底層數組的引用,將一個切片分配給另一個切片只會重複該引用。

在範例程式碼中, arr := []int{1, 2, 3, 4, 5} 行建立了一個引用匿名底層整數陣列的切片。當執行 arr2 := arr 時,它會建立一個新切片,該切片也引用相同的底層數組。

數組處理的含義

由於 arr 和 arr2 都引用相同的底層數組,因此修改 arr shuffle() 函數中也會影響 arr2。此行為符合將一個切片分配給另一個切片的原則,只需複製引用,而不是建立底層數組的新副本。

因此,程式碼正確地對 arr 和 arr2 進行洗牌,因為它們都引用相同的底層整數數組。

以上是為什麼打亂一個切片會影響引用同一底層數組的另一個切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn