首頁  >  文章  >  後端開發  >  為什麼在 Go 中打亂切片會影響分配給它的切片?

為什麼在 Go 中打亂切片會影響分配給它的切片?

Patricia Arquette
Patricia Arquette原創
2024-10-27 03:57:03987瀏覽

Why does shuffling a slice affect a slice assigned to it in Go?

Go 中的陣列處理

在Go 中,陣列是值類型,將一個陣列分配給另一個陣列會建立其所有元素的副本。即使將數組傳遞給函數時也是如此,因為它將收到副本而不是記憶體引用。

原始問題

提出了有關以下程式碼:

<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 受到shuffle 函數的影響表示困惑,儘管他們期望arr2 和arr 是不同的實體。

澄清

問題源自於陣列與切片之間的誤解。

數組與切片

數組是固定長度的值集合,而切片是對底層數組的動態引用。在提供的程式碼範例中,沒有使用數組。

切片操作

arr := []int{1, 2, 3, 4, 5} 行建立一個引用匿名底層陣列的切片。隨後的 arr2 := arr 行只是複製此引用,導致 arr 和 arr2 都指向同一個底層數組。

函數行為

當 arr 傳遞給shuffle 函數時,就會建立切片的副本,而不是底層陣列。這個副本是由函數修改的,這就是為什麼 arr 被修改時 arr2 也會受到影響。

結論

在 Go 中,切片的行為就像對底層數組的引用。將一個切片分配給另一個切片會複製引用,而不是底層數組。這個概念對於理解 Go 中的切片操作至關重要。

以上是為什麼在 Go 中打亂切片會影響分配給它的切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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