Sau khi đọc phần sau đây tại http://golang.org/doc/effective_go.html#arrays ...Xử lý Mảng tại Gò
- Mảng là những giá trị. Gán một mảng cho mảng khác sao chép tất cả các phần tử .
- Cụ thể, nếu bạn chuyển một mảng vào một hàm, nó sẽ nhận được một bản sao của mảng đó, chứ không phải là con trỏ đến nó.
... Tôi hy vọng trong đoạn mã sau đó arr2
được phân biệt với arr
, và main()
's arr
được phân biệt với shuffle()
' s arr
. Ai đó có thể vui lòng giải thích lý do tại sao các mã sau shuffles arr2
? Tôi biết Go vẫn còn là một ngôn ngữ trẻ; có lẽ việc điều trị mảng đã thay đổi?
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)
}
}
Lưu ý: hàm 'shuffle()' của bạn nên sử dụng 'j: = rand.Intn (i + 1)' nếu bạn loại trừ xác suất của một phần tử để duy trì tại chỗ, ví dụ như trộn ngẫu nhiên '{1, 2} 'luôn luôn dẫn đến' {2, 1} 'và không bao giờ có kết quả' {1, 2} 'có thể khác. – icza