Les Slices (tableaux dynamiques) dans le langage de programmation Go

Ce chapitre vous explique les Slices en GoLang. Elles permettent de créer des tableaux dynamiques. Vous allez apprendre à déclarer et à copier une Slice mais aussi à récupérer, rajouter, modifier et supprimer les éléments d'une Slice dans le langage de programmation Go.

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

Membre
28/04/19

Super ressource pour les Slices en GoLang

25/04/19

La section sur copier le contenu d'une Slice est cruciale pour éviter les erreurs subtiles

23/04/19

Go sans Slices c pas du Go haha

Membre
22/04/19

la partie sur supprimer un élément est super utile pour l'entretien des queues

Membre
19/04/19

Apprécié la clarté sur rajouter un élément dans une Slice

18/04/19

Le guide est concis et complet sur les Slices

15/04/19

La gestion des Slices est bien plus flexible que les tableaux fixes

14/04/19

Indispensable pour gérer des collections de données variables

11/04/19

Très bon chapitre sur les Slices Go

08/04/19

Les tableaux dynamiques c'est la vie en Go

07/04/19

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

05/04/19

Supprimer un élément dans une Slice bien pratique pour le nettoyage

03/04/19

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

31/03/19

Déclarer une Slice très simple comme on aime

29/03/19

Pourquoi les Slices bien expliqué ça répond à la question directe

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire