« Convert string to integer type in Go? » — une question qui tourmente les débutants
\n\nQuiconque 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 ?
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.
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\n1. L'outil principal : le package strconv
\n\nDans 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
Atoi(s string) (int, error)— l'option la plus simple, convertit une chaîne enint(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
L'erreur la plus courante est d'ignorer l'erreur retournée. Voyons ce que cela entraîne.
\n\nExemple 1 : Ignorer l'erreur — obtenir un bug
\n\npackage 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\nEn 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 !
2. Top 5 des erreurs lors de la conversion de string en int en Golang
\n\nNous avons analysé les questions sur Stack Overflow et identifié les problèmes les plus fréquents. Les voici :
\n\nErreur n°1 : Espaces et caractères invisibles
\n\nLa 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.
s := " 42 "\nnum, err := strconv.Atoi(s)\nif err != nil {\n fmt.Println("Erreur :", err) // strconv.Atoi: parsing " 42 ": invalid syntax\n}\n\n\nSolution : utilisez strings.TrimSpace() avant la conversion.
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\nErreur n°2 : Chaîne vide
\n\nUne 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.
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n\n\nSolution : vérifiez la longueur de la chaîne ou traitez l'erreur explicitement en fournissant une valeur par défaut.
\n\nErreur n°3 : Débordement (overflow)
\n\nSi 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.
s := "99999999999999999999" // plus grand que int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er