首頁 >後端開發 >Golang >Go 切片和陣列在分配和傳遞時的處理方式相同嗎?

Go 切片和陣列在分配和傳遞時的處理方式相同嗎?

DDD
DDD原創
2024-10-26 01:23:27341瀏覽

 Are Go Slices and Arrays Treated the Same When Assigned and Passed?

Go 中切片與數組的處理

在 Go 中,切片和數組儘管有相似之處,但具有不同的行為。這種差異會影響它們在分配和作為參數傳遞時的處理方式。

陣列

陣列是固定大小的元素集合,每個元素佔用一個特定的索引。將一個陣列指派給另一個陣列會產生所有元素的副本,無論其大小為何。這意味著對分配的數組進行的任何修改都不會影響原始數組。

切片

切片,另一方面,是對底層陣列的靈活、動態引用。當您將切片指派給另一個變數時,您將建立對相同基礎數組的引用,而不是副本。任一切片的修改都會影響底層數組,因此也會影響兩個引用。

程式碼範例

考慮以下 Go 程式碼:

<code class="go">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 切片,同時保持 arr 完整。但是,由於切片的工作方式,arr 和 arr2 都引用相同的底層數組。因此,當 shuffle() 交換 arr 中的元素時,變化也會反映在 arr2 中。

結論

結果為“1 5 2 4 3”,表示 arr 和 arr2 進行了混洗。這種行為是由於切片(作為引用)和數組(作為固定大小的集合)之間的區別而產生的。在 Go 中使用陣列時,了解這一根本區別非常重要。

以上是Go 切片和陣列在分配和傳遞時的處理方式相同嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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