」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼在 Go 中打亂切片會影響分配給它的切片?

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

發佈於2024-11-11
瀏覽:247

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

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)
    }
}

作者對為何 arr2 受到 shuffle 函數的影響表示困惑,儘管他們期望 arr2 和 arr 是不同的實體。

澄清

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

陣列 vs切片

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

Slice Manipulation

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

函數行為

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

結論

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

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3