http://golang.org/doc/ effective_go.html#arrays 中的文檔強調了數組基於值的性質Go ,將一個陣列指派給另一個陣列會建立所有元素的副本。這項原則也適用於函數參數,其中函數接收數組的副本,而不是指標。
基於此信息,人們會期望以下程式碼在arr2 和arr 中產生不同的數組main() 函數:
<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 進行了洗牌。這種行為源於這樣一個事實:所提供的程式碼對切片進行操作,而不是對數組進行操作。
Go 使用切片作為處理值序列的更靈活、更有效率的方式。切片是對底層數組的引用,將一個切片分配給另一個切片只會重複該引用。
在範例程式碼中, arr := []int{1, 2, 3, 4, 5} 行建立了一個引用匿名底層整數陣列的切片。當執行 arr2 := arr 時,它會建立一個新切片,該切片也引用相同的底層數組。
由於 arr 和 arr2 都引用相同的底層數組,因此修改 arr shuffle() 函數中也會影響 arr2。此行為符合將一個切片分配給另一個切片的原則,只需複製引用,而不是建立底層數組的新副本。
因此,程式碼正確地對 arr 和 arr2 進行洗牌,因為它們都引用相同的底層整數數組。
以上是為什麼打亂一個切片會影響引用同一底層數組的另一個切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!