Leçons du module (2/5)
strings et strconv
strings et strconv sont deux packages que vous utiliserez constamment. Le premier manipule les chaînes (diviser, couper, remplacer, rechercher) ; le second convertit entre les chaînes et les types de base (int, float, bool).
strings : fonctions qui se produisent tous les jours
import "strings"
strings.ToUpper("ciao") // "CIAO"
strings.ToLower("CIAO") // "ciao"
strings.Contains("ciao mondo", "mo") // true
strings.HasPrefix("foo.txt", "foo") // true
strings.HasSuffix("foo.txt", ".txt") // true
strings.Index("ciao", "a") // 2 (o -1 se assente)
strings.Count("banana", "a") // 3
strings.Split("a,b,c", ",") // []string{"a","b","c"}
strings.SplitN("a,b,c,d", ",", 2) // []string{"a","b,c,d"}
strings.Join([]string{"a","b"}, "-") // "a-b"
strings.TrimSpace(" ciao\n") // "ciao"
strings.Trim("__ciao__", "_") // "ciao"
strings.ReplaceAll("aaa", "a", "b") // "bbb"
strings.Replace("aaa", "a", "b", 2) // "bba" (limite 2)Il existe également des variantes EqualFold pour les comparaisons insensibles à la casse sans allocation et Cut(s, sep) (before, after, found) pour l'analyse sur une ligne.
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", truestrings.Builder pour concaténer en boucles
La concaténation de s = s + "x" dans une boucle alloue à chaque itération (les chaînes sont immuables). Pour les textes construits en plusieurs étapes utilisez strings.Builder :
var b strings.Builder
for i := 0; i < 1000; i++ {
b.WriteString("x")
}
out := b.String()Dotation amortie, pas de copies inutiles.
strconv : conversions chaîne ↔ nombre / booléen
import "strconv"
n, err := strconv.Atoi("42") // int da decimale
s := strconv.Itoa(42) // "42"
b, err := strconv.ParseBool("true")
// Versioni generiche con base ed eventualmente bit-size
i64, err := strconv.ParseInt("ff", 16, 64) // 255
u64, err := strconv.ParseUint("7", 10, 8) // 7
f, err := strconv.ParseFloat("3.14", 64) // 3.14
// Numero → stringa
strconv.FormatInt(255, 16) // "ff"
strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"
strconv.FormatBool(true) // "true"Atoi/Itoa sont des raccourcis ergonomiques ; pour un contrôle précis de la base et de la taille, utilisez ParseInt/FormatInt.
Gestion des erreurs d'analyse
Atoi renvoie (int, error). L'erreur est presque toujours *strconv.NumError, et vous pouvez la comparer via errors.Is avec les sentinelles strconv.ErrSyntax ou strconv.ErrRange :
n, err := strconv.Atoi(input)
switch {
case errors.Is(err, strconv.ErrSyntax):
return fmt.Errorf("input non numerico: %q", input)
case errors.Is(err, strconv.ErrRange):
return fmt.Errorf("numero fuori range: %q", input)
case err != nil:
return err
}
_ = nExercices
Divisez la chaîne « a,b,c » au niveau de la virgule et imprimez la tranche résultante.
Solution disponible après 3 tentatives
Convertissez la chaîne '42' en int avec strconv.Atoi, gérez l'erreur et imprimez le numéro.
Solution disponible après 3 tentatives
Quelle est la manière idiomatique de convertir l’entier 42 en chaîne « 42 » ?
s := ???(42)
// vogliamo s == "42"