Menu

Chaînes en Golang : Split, Join, Contains, Replace et plus

Travailler avec les chaînes en Go : le package strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), construire des chaînes efficacement avec strings.Builder, les chaînes brutes multilignes, l'immuabilité, et pourquoi len compte les octets.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

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

FonctionDécoupe surRemarques
Split(s, sep)chaque sepgarde les parties vides ; Split("", ",") renvoie [""], une chaîne vide
SplitN(s, sep, n)au plus n partiesla dernière partie contient le reste
SplitAfter(s, sep)chaque sepgarde le séparateur sur chaque partie
Fields(s)suites d'espaces blancsne renvoie jamais de parties vides
FieldsFunc(s, f)caractères pour lesquels f est vraiséparateurs personnalisés
Cut(s, sep)le premier sep seulementrenvoie 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

FonctionRenvoie
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.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER