Logo marque du langage Go

Série : Langage GO – les Slices

Les slices sont des portions de taille dynamique d’un tableau sous-jacent.

Principe

Le principe de fonctionnement d’un slice est qu’une tranche slice en Anglais est une vue partielle ou complète d’un tableau sous-jacent et permet l’accès aux éléments.

Syntaxe

Pour déclarer et instancier un slice nous allons utiliser la commande suivante :

make([]<TYPE>, longueur, capacité)

Syntaxe simplifiée

Il est possible aussi de déclarer un slice de cette manière :

[]<TYPE> {}
[]<TYPE> {<VALEURS>}

exemples

mySlice := []int {0,1,2,3}  // Avec des valeurs initiales
mySlice2 := []int{}         // Vide

Paramètres de déclaration

[]<TYPE>

Typage du slice.

longueur

Est la taille/nombre d’élément(s) du slice.

capacité

Paramètre qui n’est pas obligatoire, qui précise la taille du tableau. Dans le cas d’absence de ce paramètre, la taille du tableau sera égale à la taille du slice.

Exemple de slice

Un slice d’entier d’une taille de 5 éléments sur un tableau de 10 éléments.

mySlice := make([]int, 5, 10)

Affectation de valeurs au slice

mySlice[0] = 10
mySlice[1] = 20

Ajout de valeur(s) au slice

<SLICE_TARGET> = append(<SLICE_SRC>, <VALEUR1>, <VALEUR2>,....)

Ajoute une ou plusieurs valeurs dans le slice slice_src et retourne le slice résultant dans slice_target.

Si la taille du tableau sous-jacent dépasse la capacité du tableau alors une nouvelle instance de tableau est créé avec pour dimension le double du précédent. Les anciens éléments sont copiés et les nouveaux ajoutés.

Sub-slice

Il possible donc d’effectuer des vues d’un tableau sous-jacent mais dans certains il serait intéressant de faire des vues d’une vue déjà exisante. Pour cela, on utilisera la syntaxe suivante :

<NEW_SLICE> := <SLICE_SRC>[debut:fin]

Paramètres du sub-slice

debut

Index de départ du sub-slice.

Si le paramètre est omis alors Go considérera que le début est l'index 0.

fin

Longueur du Sub-slice. Calculer de la manière suivante : fin – debut

Si le paramètre est omis alors GO considérera que la fin est la longueur totale du slice.

Exemple de sub-slice

mySubSlice := mySlice[1:3]

Création d’un sub-slice avec pour index de départ 1 et longeur (3-1) soit 2 éléments.

Modification de valeur

Il faut retenir que lors de la modification d’une valeur dans un slice ou sub-slice cela aura un impacte sur tous car on modifie la valeur du tableau sur lequel les vues sont faites.

package main

    import "fmt"

    func main() {
        mySlice := make([]int, 2, 5)

        mySlice = append(mySlice, 30, 40)
        mySlice[1] = 2

        mySubSlice := mySlice[1:3]

        fmt.Printf("%v, len=%d, cap=%d \n", mySlice, len(mySlice), cap(mySlice))
        fmt.Printf("%v, len=%d, cap=%d \n", mySubSlice, len(mySubSlice), cap(mySubSlice))

        mySlice[2] = -1

        fmt.Printf("%v, len=%d, cap=%d \n", mySlice, len(mySlice), cap(mySlice))
        fmt.Printf("%v, len=%d, cap=%d \n", mySubSlice, len(mySubSlice), cap(mySubSlice))
    }

Le résultat sera le suivant :

[0 2 30 40], len=4, cap=5 
[2 30], len=2, cap=4      
[0 2 -1 40], len=4, cap=5 
[2 -1], len=2, cap=4      

Copie de slice

Il est possible d’effectuer une copie d’un slice vers un autre. Avec la commande :

copy(<SLICE_DEST>,<SLICE_SRC>)

avec <SLICE_DEST> déclaré avec l’instruction make

Exemple de copie

mySliceCopy := make([]int, len(mySlice))
copy(mySliceCopy, mySlice)

A lire aussi …

Frédéric Schmidt

Lead Technical Architect.

Ajouer un commentaire

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Recent Comments

    %d blogueurs aiment cette page :