Po przeczytaniu poniższych w http://golang.org/doc/effective_go.html#arrays ...Leczenie tablic w Go
- Tablice są wartości. Przypisanie jednej tablicy do drugiej powoduje skopiowanie wszystkich elementów .
- W szczególności, jeśli przekażesz tablicę do funkcji, otrzymasz kopię tablicy, a nie wskaźnik do niej.
... Spodziewam się, w poniższym kodzie że arr2
należy odróżnić od arr
i main()
's arr
należy odróżnić od shuffle()
' s arr
. Czy ktoś może wyjaśnić, dlaczego poniższy kod tasuje się pod numerem arr2
? Wiem, że Go to wciąż młody język; może zmieniło się traktowanie tablic?
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)
}
}
Uwaga: twoja funkcja 'shuffle()' powinna używać 'j: = rand.Intn (i + 1)' else wykluczasz prawdopodobieństwo, że element pozostanie na miejscu, więc na przykład tasowanie '{1, 2} 'zawsze powodowałoby' {2, 1} 'i nigdy w innym możliwym wyniku' {1, 2} '. – icza