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