Sobes.tech
Junior

Comment travailler avec des slices en Go?

sobes.tech IA

Réponse de l'IA

Les slices en Go ne sont pas des tableaux, mais font référence à un segment (ou à tout) du tableau de base. Ce sont des structures de données dynamiques.

Création de slices :

  • À partir d'un tableau :
// définir un tableau
arr := [5]int{1, 2, 3, 4, 5}
// créer un slice à partir d'une partie du tableau
s1 := arr[1:4] // s1 contient les éléments arr[1], arr[2], arr[3]
// créer un autre slice
s2 := arr[:3]  // s2 contient les éléments arr[0], arr[1], arr[2]
// créer un slice pointant à tout le tableau
s3 := arr[2:]  // s3 contient les éléments arr[2], arr[3], arr[4]
// créer un slice pointant à tout le tableau
s4 := arr[:]
  • Avec make :
// Créer un slice de longueur 5 et capacité 5
s := make([]int, 5)
// Créer un slice de longueur 5 et capacité 10
s_cap := make([]int, 5, 10)
  • Littéral :
s := []int{1, 2, 3}

Propriétés principales du slice :

  • len(s): retourne la longueur actuelle du slice.
  • cap(s): retourne la capacité du slice (le nombre maximum d'éléments qu'il peut contenir avant une réallocation).

Ajout d'éléments (append) :

s := []int{1, 2}
s = append(s, 3)      // ajoute un élément
s = append(s, 4, 5)   // ajoute plusieurs éléments
s2 := []int{6, 7}
s = append(s, s2...) // ajoute les éléments d'un autre slice

append peut entraîner une réallocation du tableau de base si la capacité n'est pas suffisante.

Suppression d'éléments :

La suppression d'éléments d'un slice se fait en créant un nouveau slice avec les éléments restants ou en copiant.

s := []int{1, 2, 3, 4, 5}
// Suppression de l'élément à l'indice i
i := 2 // supprimer l'élément à l'indice 2 (c'est-à-dire 3)
s = append(s[:i], s[i+1:]...)

Copie de slices :

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // copie les éléments de src dans dst

copy copie le minimum de la longueur des deux slices.

Itération sur un slice :

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - indice, v - valeur
}
for i := range s {
    // seulement l'indice
}
for _, v := range s {
    // seulement la valeur
}

Les slices sont des types de référence :

Les modifications dans un slice se reflètent dans le tableau de base et dans d'autres slices référant à la même mémoire.

arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]

s1[0] = 99
// Maintenant arr : [1, 99, 3, 4, 5]
// s1 : [99, 3, 4]
// s2 : [3, 4, 5] (l'élément arr[2] a changé)