【发布时间】:2011-05-12 10:11:08
【问题描述】:
在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}结果。