web-dev-qa-db-fra.com

Aller lang lang et les types de données slice

Je suis nouveau dans la langue Go. Je me suis retrouvé confondu avec les types de données array et slice.

À partir des documents Go, les tableaux sont décrits comme suit:

Il existe des différences majeures entre les modes de fonctionnement des tableaux dans Go et C. In 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, pas un pointeur sur celui-ci.
  • La taille d'un tableau fait partie de son type. Les types [10] int et [20] int sont distincts.

Les fonctions:

Comme dans toutes les langues de la famille C, tout ce qui se trouve dans Go est transmis par valeur. Autrement dit, une fonction obtient toujours une copie de la chose en cours passé, comme s'il y avait une instruction d'affectation assignant la valeur au paramètre. Par exemple, passer une valeur int à une fonction fait une copie de l'int, et passer une valeur de pointeur fait une copie de le pointeur, mais pas les données qu'il pointe.

Pourquoi sort.Ints(arrayValue) modifie-t-il la variable transmise lorsque je l'ai déclarée sous forme de tableau et non de tranche?

Code

var av = []int{1,5,2,3,7}

fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return

Sortie

[1 5 2 3 7]
[1 2 3 5 7]
46
duganets

Voir " Tranches: utilisation et internes "

var av = []int{1,5,2,3,7}

C'est une tranche, pas un tableau.

Un littéral de tranche est déclaré comme un littéral de tableau, sauf que vous omettez le nombre d'éléments.

Cela explique pourquoi la fonction de tri modifiera le contenu de ce qui est référencé par la tranche.

Comme indiqué ci-dessous par Kirk , sort.Ints vous donnera une erreur si vous lui avez passé un tableau au lieu d'une tranche.

func Ints(a []int)
38
VonC

Parce que vous utilisez une tranche, pas un tableau.

C'est une tranche:

var av = []int{1,5,2,3,7}

Et ce sont des tableaux:

var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}

Si vous essayez de compiler:

var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)

, vous obtiendrez une erreur:

ne peut pas utiliser av (type [5] int) comme type [] int dans l'argument de la fonction

as sort.Ints s'attend à recevoir un slice [] int .

41
Artem Shitov

[]int{1,5,2,3,7} n'est pas un tableau. Un tableau a sa longueur dans son type, comme [5]int{1,5,2,3,7}.

Faites une copie de la tranche et triez-la à la place:

a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)
11
Moshe Revah
var av = []int{1,5,2,3,7}

dans la déclaration ci-dessus, vous initialisez la tranche comme un tableau 

Pour créer un tableau, la syntaxe doit être 

var av = [5]int{1,5,2,3,7}
3
user2383973

les tranches sont un pointeur sur un tableau. lorsque vous copiez un tableau dans un autre ou lorsque vous passez un tableau dans la fonction, toute la copie du tableau est copiée ou transmise. Cela rend les opérations plus coûteuses si la taille du tableau est grande. afin que nous puissions aller pour des tranches.

0
swarna