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]
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)
, 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.
[]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)
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}