Dans Golang, 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?
En plus de fabriziom 's answer , vous pouvez voir plus d'exemples sur " Go Slices: usage et internals ", où une utilisation de []int
Est mentionné:
Puisque la valeur zéro d'une tranche (
nil
) agit comme une tranche de longueur nulle , vous pouvez déclarer une variable de tranche, puis ajouter en 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 besoin d'allouer de la mémoire en premier: la tranche nil
p int[]
Est suffisante en tant que tranche à ajouter.
Déclaration simple
var s []int
n'alloue pas de mémoire et s
pointe sur nil
, alors que
s := make([]int, 0)
alloue de la mémoire et s
pointe vers la mémoire sur une tranche de 0 éléments.
Généralement, le premier est plus idiomatique si vous ne connaissez pas la taille exacte de votre cas d'utilisation.
Je viens de trouver une différence. Si tu utilises
var list []MyObjects
et puis vous encodez la sortie en JSON, vous obtenez null
.
list := make([]MyObjects, 0)
résulte en []
comme prévu.
Un peu plus complètement (un argument supplémentaire dans make
) exemple:
slice := make([]int, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
En dehors:
lenght: 2 - capacity 5 - content: [0 0]
Ou avec un type dynamique de slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
En dehors:
lenght: 2 - capacity 5 - content: [<nil> <nil>]