Pour déclarer une tranche vide, de taille non fixée, vaut-il mieux faire:
mySlice1 := make([]int, 0)
ou:
mySlice2 := []int{}
Je me demandais quelle était la bonne façon.
Les deux alternatives que vous avez données sont sémantiquement identiques et je suppose qu'elles produisent les mêmes instructions d'assemblage.
Pour éviter une allocation inutile, au cas où vous n'utiliseriez pas la tranche, vous pouvez la laisser avec une valeur nil
:
var myslice []int
Comme écrit dans le blog Golang.org :
fonctionnellement, une tranche nulle équivaut à une tranche de longueur nulle, même si elle ne pointe à rien. Il a une longueur de zéro et peut être ajouté, avec attribution.
Ils sont équivalents. Voir ce code:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
Sortie:
mySlice1 0
mySlice2 0
Les deux tranches ont la capacité 0
, ce qui implique que les deux tranches ont la longueur 0
(ne peut pas être supérieure à la capacité), ce qui implique que les deux tranches ne contiennent aucun élément. Cela signifie que les 2 tranches sont identiques dans tous les aspects.
Voir des questions similaires:
Quel est l'intérêt d'avoir une tranche nulle et une tranche vide dans le golang?
tranches nulles vs tranches non nuls vs tranches vides en langue Go
En complément de @ ANisus ' répondre ...
vous trouverez ci-dessous des informations tirées du livre "Passez à l'action" , qui mérite à mon avis d'être mentionné:
nil
& empty
Si nous pensons à une tranche comme celle-ci:
[pointer] [length] [capacity]
ensuite:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // points to an address
tranche nulle
Ils sont utiles lorsque vous souhaitez représenter une tranche qui n’existe pas, par exemple lorsqu’une exception se produit dans une fonction qui renvoie une tranche.
// Create a nil slice of integers. var slice []int
tranche vide
Les tranches vides sont utiles lorsque vous souhaitez représenter une collection vide, par exemple lorsqu'une requête de base de données ne renvoie aucun résultat.
// Use make to create an empty slice of integers. slice := make([]int, 0) // Use a slice literal to create an empty slice of integers. slice := []int{}
Que vous utilisiez une tranche nulle ou vide, les fonctions intégrées
append
,len
etcap
fonctionnent de la même manière.
package main
import (
"fmt"
)
func main() {
var nil_slice []int
var empty_slice = []int{}
fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))
}
impressions:
true 0 0
false 0 0
La tranche vide et la tranche nulle sont initialisées différemment dans Go:
var nilSlice []int
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}
fmt.Println(nilSlice == nil) // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false
Comme pour les trois tranches, len et cap sont 0.