在 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中文網其他相關文章!