阅读以下内容:http://golang.org/doc/effective_go.html#arrays...
- 数组是值。将一个数组分配给另一个数组会复制所有元素。
- 特别地,如果您将一个数组传递给函数,它将接收到该数组的副本,而不是指向它的指针。
... 我期望在以下代码中,arr2
与 arr
不同,并且 main()
的 arr
与 shuffle()
的 arr
不同。有人能解释一下为什么以下代码会打乱 arr2
吗?我知道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()
函数应该使用j := rand.Intn(i + 1)
,否则你会排除一个元素保持原位的可能性,因此例如对{1, 2}
进行洗牌总是得到{2, 1}
而不是另一种可能的{1, 2}
结果。 - icza