Dans Go, quelle est la différence entre var s []int
et s := make([]int, 0)
?
Je trouve que les deux fonctionnent, mais lequel est le meilleur?
go
allocation
slice
Wang Yi
la source
la source
nil
tranche, tandis que le second crée uneempty
tranche (c'est la terminologie utilisée par le "Go in action book" ). Pour éviter de publier la même réponse ici aussi, vous pouvez consulter stackoverflow.com/a/45997533/1561148Réponses:
En plus de la réponse de fabriziom , vous pouvez voir plus d'exemples sur " Go Slices: usage and internals ", où une utilisation pour est mentionnée:
[]int
Cela signifie que, pour ajouter à une tranche, vous n'avez pas à allouer de mémoire en premier: la
nil
tranchep int[]
est suffisante en tant que tranche à ajouter.la source
var p []int
plus facile que d'utilisermake
(que j'associe davantage à l'allocation, même si avec un plafond de 0, elle n'allouerait rien). En terme de lisibilité, je préfère ne pas utilisermake
ici.p := []int{}
). Puisque nous utilisons généralement la:=
syntaxe pour déclarer la plupart des variables, il est plus naturel de l'avoir partout au lieu d'avoir des exceptions pour les tranches. En dehors de cela, essayer de penser aux allocations pousse généralement les gens vers des optimisations prématurées.Déclaration simple
n'alloue pas de mémoire et
s
pointe versnil
, tandis quealloue de la mémoire et
s
pointe vers la mémoire une tranche avec 0 élément.Habituellement, le premier est plus idiomatique si vous ne connaissez pas la taille exacte de votre cas d'utilisation.
la source
make
cartes, car même unmap
espace vide a besoin d'un espace alloué pour une comptabilité.nil
au cas où votre tranche n'aurait aucun élément, plutôt qu'un tableau vide. Cependant, simake
est utilisé pour créer la tranche, un tableau vide sera renvoyé à la place, ce qui est généralement l'effet souhaité.var s []int
) produiranull
, tandis que le marshaling de la tranche vide (s := make([]int, 0)
) produira le résultat attendu[]
Je viens de trouver une différence. Si tu utilises
puis vous encodez la sortie en JSON, vous obtenez
null
.résultats
[]
comme prévu.la source
Un peu plus complètement (un autre argument dans
make
) exemple:En dehors:
Ou avec type dynamique de
slice
:En dehors:
la source