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) } }
在此程式碼中,shuffle 函數將陣列作為輸入並對其元素進行洗牌。然而,即使我們在呼叫 shuffle 之前將原始陣列分配給新變數 arr2,函數內對 arr 所做的變更也會反映在 arr2 中。
切片與陣列
Go 區分了切片和陣列。數組是固定長度的值列表,而切片是對底層數組的引用。在程式碼範例中,arr 和 arr2 都引用相同的底層陣列。因此,對 arr 所做的任何修改也將應用於 arr2。要建立數組的不同副本,必須使用make 分配切片:
arr := []int{1, 2, 3, 4, 5} arr2 := make([]int, len(arr)) copy(arr2, arr)
在此更新版本中,arr2 不再是對原始數組的引用,因此對arr 所做的修改不會影響arr2.
以上是為什麼在 Go 中修改函數內部的陣列也會更改分配給函數外部同一數組的變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!