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