Ré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
Étant donné que la valeur zéro d'une tranche (
nil
) agit comme une tranche de longueur nulle , vous pouvez déclarer une variable de tranche, puis y ajouter une boucle:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
Cela signifie que, pour ajouter à une tranche, vous n'avez pas à allouer de mémoire en premier: la nil
tranche p int[]
est suffisante en tant que tranche à ajouter.
var p []int
plus facile que d'utiliser make
(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 utiliser make
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
var s []int
n'alloue pas de mémoire et s
pointe vers nil
, tandis que
s := make([]int, 0)
alloue 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.
make
cartes, car même un map
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, si make
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
) produira null
, 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
var list []MyObjects
puis vous encodez la sortie en JSON, vous obtenez null
.
list := make([]MyObjects, 0)
résultats []
comme prévu.
Un peu plus complètement (un autre argument dans make
) exemple:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
En dehors:
length: 2 - capacity 5 - content: [0 0]
Ou avec type dynamique de slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
En dehors:
length: 2 - capacity 5 - content: [<nil> <nil>]
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/1561148