Conversion de chaîne en nombre en Go : 5 pièges et leurs solutions

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

« Convert string to integer type in Go? » — une question qui tourmente les débutants

\n\n

Quiconque a commencé à programmer en Go s'est tôt ou tard heurté à un mur : il faut prendre une chaîne comme "42" et la transformer en un nombre entier 42. Cela semble simple, non ? Pourtant, cette question sur Stack Overflow recueille des milliers de vues, et en dessous, des dizaines de commentaires avec des erreurs typiques. Pourquoi cela arrive-t-il ?

\n\n

En Go, il n'y a pas de int("42") familier comme en Python ou JavaScript. À la place, on trouve un package puissant mais strict, strconv, qui vous oblige à réfléchir à ce qui pourrait mal tourner. Et c'est une bonne chose : vous ne pouvez pas simplement « passer » une chaîne en int, car la chaîne peut être corrompue, vide ou contenir des espaces superflus.

\n\n

Dans cet article, nous allons analyser la conversion de chaîne en nombre en Go avec des exemples concrets, passer en revue les pièges dans lesquels même les développeurs expérimentés tombent, et fournir des modèles de code fonctionnels. C'est parti !

\n\n

1. L'outil principal : le package strconv

\n\n

Dans la bibliothèque standard de Go, le package strconv est responsable de la conversion des chaînes. Il propose trois fonctions principales pour convertir une chaîne en nombre entier :

\n\n
    \n
  • Atoi(s string) (int, error) — l'option la plus simple, convertit une chaîne en int (la taille dépend de la plateforme : 32 ou 64 bits).
  • \n
  • ParseInt(s string, base int, bitSize int) (int64, error) — offre un contrôle total : la base du système de numération (10, 16, 2) et la taille en bits (0, 8, 16, 32, 64).
  • \n
  • ParseUint(s string, base int, bitSize int) (uint64, error) — la même chose, mais pour les nombres non signés.
  • \n
\n\n

L'erreur la plus courante est d'ignorer l'erreur retournée. Voyons ce que cela entraîne.

\n\n

Exemple 1 : Ignorer l'erreur — obtenir un bug

\n\n
package main\n\nimport (\n    "fmt"\n    "strconv"\n)\n\nfunc main() {\n    s := "123abc"\n    num, _ := strconv.Atoi(s) // Erreur avalée !\n    fmt.Println(num)          // Affiche : 0 — et vous ne saurez même pas ce qui a mal tourné\n}\n
\n\n

En Go, il n'y a pas d'exceptions, l'erreur est une valeur. Si vous l'ignorez (_), vous obtiendrez la valeur zéro (0) et passerez des heures à déboguer, en vous demandant pourquoi votre programme se comporte étrangement. Traitez toujours l'erreur !

\n\n

2. Top 5 des erreurs lors de la conversion de string en int en Golang

\n\n

Nous avons analysé les questions sur Stack Overflow et identifié les problèmes les plus fréquents. Les voici :

\n\n

Erreur n°1 : Espaces et caractères invisibles

\n\n

La chaîne " 42 " ou "42\\n" — Atoi retournera une erreur. Go ne tolère pas les caractères superflus, contrairement à certains langages qui suppriment automatiquement les espaces.

\n\n
s := " 42 "\nnum, err := strconv.Atoi(s)\nif err != nil {\n    fmt.Println("Erreur :", err) // strconv.Atoi: parsing " 42 ": invalid syntax\n}\n
\n\n

Solution : utilisez strings.TrimSpace() avant la conversion.

\n\n
import "strings"\n\ns := " 42 "\ns = strings.TrimSpace(s)\nnum, err := strconv.Atoi(s)\nif err == nil {\n    fmt.Println(num) // 42\n}\n
\n\n

Erreur n°2 : Chaîne vide

\n\n

Une chaîne vide "" est aussi une erreur. De nombreux débutants s'attendent à ce qu'une chaîne vide se transforme en 0, mais ce n'est pas le cas.

\n\n
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n
\n\n

Solution : vérifiez la longueur de la chaîne ou traitez l'erreur explicitement en fournissant une valeur par défaut.

\n\n

Erreur n°3 : Débordement (overflow)

\n\n

Si la chaîne contient un nombre qui ne tient pas dans le type choisi, Atoi ou ParseInt retourneront l'erreur ErrRange et la valeur maximale/minimale pour ce type.

\n\n
s := "99999999999999999999" // plus grand que int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er                

Blogs

Book Recommendations