Une chaîne Go est une séquence immuable d'octets, normalement du texte UTF-8. Les opérateurs travaillent sur la chaîne elle-même (+, ==, <, indexation, découpage), et tout le reste se trouve dans le package standard strings.
Découper des chaînes
| Fonction | Découpe sur | Remarques |
|---|---|---|
Split(s, sep) | chaque sep | garde les parties vides ; Split("", ",") renvoie [""], une chaîne vide |
SplitN(s, sep, n) | au plus n parties | la dernière partie contient le reste |
SplitAfter(s, sep) | chaque sep | garde le séparateur sur chaque partie |
Fields(s) | suites d'espaces blancs | ne renvoie jamais de parties vides |
FieldsFunc(s, f) | caractères pour lesquels f est vrai | séparateurs personnalisés |
Cut(s, sep) | le premier sep seulement | renvoie avant, après, trouvé (Go 1.18) |
Le cas Split("", ",") piège les gens : une entrée vide donne une slice de longueur 1, pas 0. Pour découper une saisie utilisateur, Fields ou un test préalable s == "" évite un élément vide fantôme.
strings.Cut est la façon la plus propre de découper key=value, user@host et autres paires. Go 1.24 a aussi ajouté des versions itérateurs, strings.SplitSeq et strings.FieldsSeq, qui fournissent les parties une par une sans construire de slice.
Rechercher
| Fonction | Renvoie |
|---|---|
Contains(s, sub) | true si sub apparaît dans s |
ContainsAny(s, chars) | true si l'un des caractères de chars apparaît |
HasPrefix(s, p) / HasSuffix(s, p) | true si s commence ou finit par p |
Index(s, sub) | la position en octets de la première occurrence, ou -1 |
LastIndex(s, sub) | la position en octets de la dernière occurrence, ou -1 |
Count(s, sub) | le nombre d'occurrences sans chevauchement |
EqualFold(a, b) | l'égalité insensible à la casse |
Toutes les recherches sont sensibles à la casse sauf EqualFold. Pour chercher sans tenir compte de la casse, passez les deux côtés en minuscules, ou utilisez EqualFold pour comparer des chaînes entières.
Transformer
Un piège : Trim, TrimLeft et TrimRight prennent un ensemble de caractères, pas un préfixe. strings.TrimLeft("abcab", "ab") retire tous les a et b en tête et renvoie "cab". Pour retirer un préfixe ou un suffixe exact, utilisez TrimPrefix et TrimSuffix.
Concaténation et strings.Builder
+ assemble des chaînes, et fmt.Sprintf formate des valeurs en une chaîne. Les deux allouent une nouvelle chaîne à chaque fois, parce que les chaînes sont immuables. C'est acceptable pour quelques opérations et lent dans une boucle, où chaque += recopie tout ce qui a déjà été construit. Utilisez plutôt strings.Builder :
Un strings.Builder à zéro est prêt à l'emploi. Il implémente io.Writer, donc fmt.Fprintf écrit directement dedans. Appelez d'abord b.Grow(n) si vous connaissez à peu près la taille du résultat. Ne copiez pas un Builder après avoir écrit dedans ; passez un pointeur.
Chaînes multilignes et chaînes brutes
Go a deux sortes de littéraux de chaîne :
Les chaînes entre guillemets doubles interprètent les échappements (\n, \t, \", \\, \u00e9) et doivent tenir sur une ligne. Les chaînes brutes entre accents graves prennent tout littéralement, retours à la ligne compris, ce qui en fait la façon d'écrire des chaînes multilignes, des expressions régulières, du JSON et des chemins Windows. Une chaîne brute ne peut pas contenir d'accent grave, et les retours chariot qu'elle contient sont supprimés. Notez que la requête ci-dessus commence par un retour à la ligne, puisque le littéral démarre juste après l'accent grave ouvrant.
Longueur, indexation et sous-chaînes
len(s) est le nombre d'octets. s[i] est un octet, et s[i:j] est une sous-chaîne délimitée par des positions en octets :
ï et é occupent deux octets chacun, donc la chaîne fait 12 octets et 10 caractères. Découper par octets est sûr tant que les positions viennent de strings.Index ou d'une fonction similaire, qui renvoient des positions en octets situées sur des frontières de caractères. Pour prendre « les n premiers caractères », convertissez d'abord en []rune. La page runes et octets explique l'UTF-8 en profondeur.
Les chaînes sont immuables
Vous ne pouvez pas modifier un octet sur place : s[0] = 'H' est une erreur de compilation (cannot assign to s[0] (neither addressable nor a map index expression)). Chaque fonction de strings renvoie une nouvelle chaîne. Pour modifier, convertissez en []byte ou []rune, modifiez la slice, et reconvertissez :
b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"
L'immuabilité explique aussi pourquoi les sous-chaînes coûtent peu : s[2:5] partage la mémoire de s au lieu de la copier. Le revers, c'est qu'une petite sous-chaîne d'une énorme chaîne garde toute l'énorme chaîne en vie. Utilisez strings.Clone (Go 1.20) quand vous gardez un petit morceau d'une grosse entrée.
Comparer des chaînes
== et != comparent le contenu, et <, > comparent octet par octet, ce qui correspond à l'ordre alphabétique pour l'ASCII. strings.Compare existe mais sert rarement ; slices.Sort sur une []string utilise <. Pour trier du texte non anglais selon les règles d'une langue, utilisez golang.org/x/text/collate.
Convertir d'autres types
Les nombres deviennent des chaînes avec strconv.Itoa, strconv.FormatFloat ou fmt.Sprintf, et les chaînes deviennent des nombres avec strconv.Atoi et strconv.ParseFloat. N'écrivez pas string(42) : cela produit le caractère de point de code 42, "*". La page sur la conversion de types contient le tableau complet.
Questions fréquentes
Comment découper une chaîne en Go ?
Utilisez strings.Split(s, sep) : strings.Split("a,b,c", ",") renvoie ["a" "b" "c"]. Pour découper sur toute suite d'espaces blancs et ignorer les parties vides, utilisez strings.Fields(s). strings.SplitN limite le nombre de parties, et strings.Cut découpe une seule fois autour du premier séparateur.
Comment écrire une chaîne multiligne en Go ?
Utilisez un littéral de chaîne brute entre accents graves :
query := `SELECT id, name
FROM users
WHERE active = true`
Tout ce qui se trouve entre les accents graves est pris littéralement, retours à la ligne et antislashs compris. Une chaîne brute ne peut pas contenir d'accent grave.
Comment vérifier qu'une chaîne contient une sous-chaîne en Go ?
strings.Contains(s, substr) renvoie un bool. Fonctions liées : strings.HasPrefix, strings.HasSuffix, strings.Index (position ou -1), strings.ContainsAny (l'un des caractères d'un ensemble), et strings.EqualFold pour une égalité insensible à la casse.
Quelle est la façon la plus rapide de concaténer des chaînes en Go ?
Pour quelques chaînes, + convient. Pour construire une chaîne dans une boucle, utilisez strings.Builder : appelez WriteString autant de fois que nécessaire et String() une seule fois à la fin. Des += répétés dans une boucle copient toute la chaîne à chaque fois, donc cela ralentit à mesure que la chaîne grandit. Pour joindre une slice avec un séparateur, utilisez strings.Join.
Pourquoi len renvoie-t-il une mauvaise longueur pour ma chaîne ?
len(s) renvoie le nombre d'octets, pas de caractères. Les chaînes Go sont en UTF-8, où les caractères hors ASCII occupent 2 à 4 octets, donc len("héllo") vaut 6. Utilisez utf8.RuneCountInString(s) pour obtenir le nombre de points de code Unicode.