web-dev-qa-db-fra.com

Déclarer tranche ou faire tranche?

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?

83
Wang Yi

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 nilp int[] Est suffisante en tant que tranche à ajouter.

84
VonC

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.

96
fabrizioM

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.

3
Steve Hanov

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>]
3
Benyamin Jafari