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中文网其他相关文章!