Pourquoi les Slices ?
Le problème avec un tableau c’est qu’il a une taille fixe, il faut donc absolument connaître sa taille au moment de sa déclaration ce qui n’est pas vraiment évident car on peut très vite s’apercevoir plus tard dans notre code que la taille allouée au départ à notre tableau est insuffisante.
Et c’est là qu’interviennent les Slices dans Go, Ils vont nous permettre d’avoir un tableau flexible et le dimensionner de façon dynamique sans se soucier de sa taille pendant sa déclaration.
Déclarer une Slice
Il existe deux façons pour créer une Slice.
Soit à partir de la même syntaxe qu'un tableau sauf que cette fois-ci on ne spécifie pas la taille du tableau :
package main
import (
"fmt"
)
func main() {
var nombres = []int{0, 0, 0, 0, 0} // création d'une slice avec 5 éléments
fmt.Println(nombres)
}
Résultat :
[0 0 0 0 0]
Soit depuis la fonction make()
package main
import (
"fmt"
)
func main() {
var nombres = make([]int, 5) // création d'une slice avec 5 éléments
fmt.Println(nombres)
}
Résultat :
[0 0 0 0 0]
Rajouter un élément dans une Slice
Pour rajouter un élément dans votre slice il faut utiliser la fonction append(), qui prend comme paramètres d'abord votre slice et ensuite l'élément que vous voulez rajouter et elle vous retournera une nouvelle Slice avec l'élément rajouté.
package main
import "fmt"
func main() {
var mois []string
mois = append(mois, "Janvier")
fmt.Println(mois)
mois = append(mois, "Février")
fmt.Println(mois)
}
Résultat :
[Janvier]
[Janvier Février]
Supprimer un élément dans une Slice
Il n'existe pas spécialement de fonction dans Go qui permet de supprimer un élément, mais il est possible de réutiliser la fonction append() pour supprimer un élément en Go.
Avant de vous montrer comment faire pour supprimer n'importe quel élément d'une slice, laissez-moi avant vous expliquer comment fonctionne la fonction append().
Voici à quoi ressemble le prototype de la fonction append() :
func append(slice []Type, elems ...Type) []Type
La fonction append() prend comme premier argument une Slice, le second paramètre est quant à lui est un paramètre variadique c'est-à-dire qu'il prend en compte un nombre indéterminé de paramètres.
Comme il est possible de rajouter un nombre indéterminé de paramètres sur le deuxième paramètre de la fonction append() , alors pour supprimer un élément il suffit de concaténer les éléments qui sont avant l'élément qu'on souhaite supprimer dans notre slice avec les éléments qui sont après l'élément qu'on souhaite supprimer dans notre slice.
Ce qui nous donne :
package main
import "fmt"
func main() {
mois := []string{"Janvier", "Février", "Mars", "Avril", "Juin", "Juillet"}
fmt.Println(mois)
// index à supprimer de notre slice
indexASupprimer := 1
// Suppression de l'index 1 du tableau soit "Février"
mois = append(mois[:indexASupprimer], mois[(indexASupprimer+1):]...)
fmt.Println(mois)
}
Résultat :
[Janvier Février Mars Avril Juin Juillet]
[Janvier Mars Avril Juin Juillet]
Copier le contenu d'une Slice
Il est possible de copier le contenu d'une slice source vers une slice cible grâce à la fonction copy(). Cette fonction prend comme premier paramètre la slice cible et comme deuxième paramètre la slice source.
Attention
La fonction copy() copie le contenu d’une tranche source vers une source cible, il est donc important que la slice cible soit de même taille que la slice source afin de copier le contenu total de la cible.
package main
import "fmt"
func main() {
animaux1 := []string{"Lion", "Cheval", "Ours"}
fmt.Println("Contenu du tableau animaux1 :", animaux1)
// création d'une slice cible avec la même taille que la slice source
animaux2 := make([]string, len(animaux1))
// copie du contenu de la slice source vers la slice cible
copy(animaux2, animaux1)
fmt.Println("Contenu du tableau animaux2 :", animaux2)
}
Résultat :
Contenu du tableau animaux1 : [Lion Cheval Ours]
Contenu du tableau animaux2 : [Lion Cheval Ours]
Espace commentaire
Écrire un commentaire
Vous devez être connecté pour poster un message !
15 commentaires
Super ressource pour les Slices en GoLang
La section sur copier le contenu d'une Slice est cruciale pour éviter les erreurs subtiles
Go sans Slices c pas du Go haha
la partie sur supprimer un élément est super utile pour l'entretien des queues
Apprécié la clarté sur rajouter un élément dans une Slice
Le guide est concis et complet sur les Slices
La gestion des Slices est bien plus flexible que les tableaux fixes
Indispensable pour gérer des collections de données variables
Très bon chapitre sur les Slices Go
Les tableaux dynamiques c'est la vie en Go
Copier le contenu d'une Slice c'est un point souvent mal compris merci
C'est vital pour éviter des effets de bord sur nos configurations en mémoire
Supprimer un élément dans une Slice bien pratique pour le nettoyage
Rajouter un élément dans une Slice c'est la base pour les logs dynamiques
On gère des flux de données en temps réel et les Slices sont parfaites pour ça
Déclarer une Slice très simple comme on aime
Pourquoi les Slices bien expliqué ça répond à la question directe