Comment obtenir le dernier élément d'une slice en Go : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Préface : pourquoi cette question est-elle si populaire ?

\n\n

Si vous avez déjà écrit ne serait-ce que quelques lignes de code en Go, vous avez très probablement rencontré les slices. C'est une structure de données flexible, puissante et sans doute la plus utilisée dans le langage. Et, comme c'est souvent le cas, la question la plus simple — « comment obtenir le dernier élément ? » — s'avère être l'une des plus fréquentes sur Stack Overflow. Des milliers de développeurs, des débutants aux experts, recherchent cette information. Pourquoi ?

\n\n

Premièrement, la syntaxe de Go est concise, et l'intuition suggère : « puisqu'il y a un premier élément (slice[0]), il doit y avoir un dernier élément ». Mais Go n'a pas de méthode .Last() ou slice[-1], comme en Python. Deuxièmement, les pièges avec les slices vides et les dépassements d'index surprennent même les programmeurs expérimentés.

\n\n

Dans ce tutoriel, nous allons passer en revue toutes les façons d'obtenir le dernier élément d'une slice en Go, de la méthode classique à la méthode avancée, avec des exemples de code et l'analyse des erreurs typiques. C'est parti !

\n\n

1. La méthode classique : len(slice) — 1

\n\n

La méthode la plus directe et la plus utilisée consiste à accéder à l'élément dont l'index est égal à la longueur de la slice moins un. En Go, l'indexation commence à zéro, donc si vous avez une slice de 5 éléments, leurs index sont : 0, 1, 2, 3, 4.

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    numbers := []int{10, 20, 30, 40, 50}\n    last := numbers[len(numbers)-1]\n    fmt.Println(last) // Affiche : 50\n}\n
\n\n

Tout fonctionne parfaitement. Mais il y a un détail important : la slice vide. Si vous essayez d'appeler len(emptySlice)-1 sur une slice vide, la longueur sera 0, l'index deviendra -1, et le programme plantera avec une panique index out of range.

\n\n
var empty []int\n// last := empty[len(empty)-1] // PANIQUE : runtime error: index out of range [-1]\n
\n\n

Conclusion : Cette méthode est parfaite lorsque vous êtes certain que la slice n'est pas vide. Sinon, lisez la suite.

\n\n

2. La méthode sécurisée avec vérification de la longueur

\n\n

Pour éviter la panique, il suffit de vérifier la longueur de la slice avant d'accéder au dernier élément. C'est une approche idiomatique et sécurisée qu'il convient d'utiliser dans le code de production.

\n\n
func GetLastElement(s []int) (int, bool) {\n    if len(s) == 0 {\n        return 0, false // ou une autre valeur par défaut\n    }\n    return s[len(s)-1], true\n}\n
\n\n

Et voici un exemple d'utilisation dans la fonction principale :

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    slice1 := []string{"Go", "Python", "Rust"}\n    slice2 := []string{}\n\n    if last, ok := safeLast(slice1); ok {\n        fmt.Println("Dernier élément de slice1 :", last) // Rust\n    }\n\n    if _, ok := safeLast(slice2); !ok {\n        fmt.Println("slice2 est vide, pas de dernier élément")\n    }\n}\n\nfunc safeLast(s []string) (string, bool) {\n    if len(s) == 0 {\n        return "", false\n    }\n    return s[len(s)-1], true\n}\n
\n\n

Pourquoi est-ce bien ? La fonction renvoie deux valeurs : l'élément lui-même et un booléen indiquant le succès. C'est un idiome standard de Go (souvenez-vous de la lecture d'une map : value, ok := myMap["key"]). Le code devient lisible et fiable.

\n\n

3. Utilisation de la réflexion (pour l'universalité)

\n\n

Parfois, on a besoin d'écrire une fonction qui fonctionne avec n'importe quel type de slice. C'est là que le package reflect vient à la rescousse. Cependant, je vous préviens : c'est plus lent et plus complexe, donc utilisez-le uniquement si c'est vraiment nécessaire.

\n\n
package main\n\nimport (\n    "fmt"\n    "reflect"\n)\n\nfunc LastElement(slice interface{}) (interface{}, bool) {\n    v := reflect.ValueOf(slice)\n    if v.Kind() != reflect.Slice {\n        return nil, false\n    }\n    if v.Len() == 0 {\n        return nil, false\n    }\n    return v.Index(v.Len() - 1).Interface(), true\n}\n\nfunc main() {\n    ints := []int{1, 2, 3}\n    strs := []string{"a", "b", "c"}\n\n    if last, ok := LastElement(ints); ok {\n        fmt                

Blogs

Book Recommendations