Types de données Go Lang array et 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 façons dont les tableaux fonctionnent dans Go et C. Dans Go,

  • Les tableaux sont des valeurs. L'affectation d'un tableau à un autre copie tous les éléments.
  • En particulier, si vous passer un tableau à une fonction, il va recevoir une copie du tableau, pas un pointeur.
  • la taille d'un tableau fait partie de son type. Les types [10]int et [20]int sont distincts.

Fonctions:

Comme dans toutes les langues de la famille C, tout dans Go est passé valeur. C'est une fonction obtient toujours une copie de la chose passé, comme s'il y avait une instruction d'affectation attribuant la valeur pour le paramètre. Par exemple, passer une valeur int à une fonction fait une copie de l'int, et en passant d'une valeur de pointeur fait une copie de le pointeur, mais pas les données qu'il points de.

Pourquoi sort.Ints(arrayValue) modifie-t-il la variable passée quand je l'ai déclarée comme un tableau, pas comme une 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]
44
demandé sur SunSparc 2012-07-31 13:29:19

4 réponses

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 avez passé un tableau au lieu d'une tranche.

func Ints(a []int)
34
répondu VonC 2017-05-23 12:16:50

, 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:

Impossible D'utiliser av (type [5]int) comme type [] int dans l'argument de fonction

Comme tri.Ints s'attend à recevoir un tranche []int.

38
répondu Artem Shitov 2012-07-31 09:38:47

[]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)
10
répondu Moshe Revah 2012-07-31 09:47:25
var av = []int{1,5,2,3,7}

Dans l'instruction ci-dessus, vous initialisez slice comme un tableau

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

var av = [5]int{1,5,2,3,7}
2
répondu user2383973 2014-07-30 01:27:21