2010-11-19 7 views
5

Après avoir lu ce qui suit à http://golang.org/doc/effective_go.html#arrays ...Traitement des tableaux dans Go

  • Les tableaux sont des valeurs. L'affectation d'un tableau à un autre copie tous les éléments .
  • En particulier, si vous passez un tableau à une fonction, il recevra une copie du tableau , et non un pointeur.

... Je me attends dans le code suivant que arr2 soit distincte de arr et main() 's arr doit être distinct de shuffle()' s arr. Quelqu'un peut-il s'il vous plaît expliquer pourquoi le code suivant shuffles arr2? Je sais que Go est encore une langue jeune; le traitement des tableaux a peut-être changé?

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) 
     } 
} 
+0

Note: votre fonction 'shuffle()' devrait utiliser 'j: = rand.Intn (i + 1)' sinon vous excluez la probabilité qu'un élément reste en place, par exemple shuffleing {1, 2} 'aboutirait toujours' {2, 1} 'et jamais dans l'autre résultat' {1, 2} 'possible. – icza

Répondre

20

Je pense que votre problème est que vous confondez des tableaux et des tranches.

Les tableaux sont des listes de valeurs de longueur fixe. En fait, vous n'utilisez aucun tableau dans votre exemple. Les tableaux peuvent être déclarés de plusieurs façons:

arr1 := [3]int{1, 2, 3} // an array of 3 integers, 1-3 
arr2 := [...]int{1, 2, 3} // same as the previous line, but we're letting 
          // the compiler figure out the size of the array 
var arr3 [3]int   // a zeroed out array of 3 integers 

Vous utilisez des tranches. Une tranche est une référence à un tableau sous-jacent. Il y a quelques façons d'attribuer de nouvelles tranches:

slice1 := []int{1, 2, 3} // a slice of length 3 containing the integers 1-3 
slice2 := make([]int, 3) // a slice of length 3 containing three zero-value integers 
slice3 := make([]int, 3, 5) // a slice of length 3, capacity 5 that's all zeroed out 

Toutes les autres missions de tranche sont tout simplement Dupliquer une référence à un tableau.

Maintenant que nous avons établi que, la ligne

arr := []int{1, 2, 3, 4, 5} 

crée une tranche référence à un tableau anonyme sous-jacente qui contient les numéros 1-5.

arr2 := arr 

doublons qui font référence - il ne pas copier le tableau sous-jacent. Il y a donc un tableau sous-jacent et deux références à celui-ci. C'est pourquoi le contenu de arr2 change lorsque vous modifiez le contenu de arr. Ils référencent le même tableau.

+1

Merci de nous l'avoir expliqué. c'est logique maintenant. – Timothy