go没有对应的内部方法, 网上也没有找到特别好用的. 模仿切片, 自己实现了一个, 有啥优化的欢迎指教.
func main() {
rand.Seed(time.Now().UnixNano())
list := []int{1, 2, 3, 4, 5}
ShuffleSlice(list)
fmt.Println(list)
}
// 打乱切片
func ShuffleSlice(x interface{}) {
rv := reflect.ValueOf(x)
swap := reflect.Swapper(x)
length := rv.Len()
for i := length - 1; i > 0; i-- {
// 在i和0之间选择一个随机数
swap(i, rand.Intn(i+1))
}
}
补充: go是打乱切片的内部方法的rand.Shuffle, 避免反射, 性能更好, 代价是要自己传闭包.
func Shuffle(n int, swap func(i, j int)) { globalRand.Shuffle(n, swap) }