Comment joindre un slice de chaînes en Go : erreurs courantes et comment les éviter
\n\nAvez-vous déjà écrit en Go et soudain réalisé : « Je dois assembler toutes ces chaînes en une seule, mais comment faire correctement ? » Cette question est l'une des plus populaires sur Stack Overflow (des dizaines de milliers de vues). Cela semble simple, non ? Mais les débutants (et pas seulement) tombent dans les mêmes pièges : ils ralentissent le code, gaspillent beaucoup de mémoire ou obtiennent des bugs inattendus.
\n\nDans cet article, nous allons analyser trois erreurs typiques lors de la jointure d'un slice de chaînes en Go et montrer comment les éviter. Vous apprendrez à choisir le bon outil pour chaque tâche, de la simple jointure aux applications à forte charge. C'est parti !
\n\nPourquoi ce sujet est-il si important ?
\n\nTravailler avec des chaînes est fondamental dans tout langage de programmation. En Go, les chaînes sont immuables (immutable). Lorsque vous « assemblez » deux chaînes avec l'opérateur +, une nouvelle chaîne est en fait créée et les anciennes sont copiées. Dans une boucle, cela se transforme en complexité quadratique O(n²). Et si les chaînes sont nombreuses (des centaines de milliers), le programme peut ralentir ou même planter avec une erreur out of memory.
De plus, Go est un langage où la performance est importante. C'est pourquoi la bibliothèque standard propose des solutions élégantes. Voyons quelles erreurs sont les plus courantes.
\n\nErreur n°1 : Concaténation en boucle avec +=
\n\nÀ quoi cela ressemble en pratique
\n\nSupposons que vous ayez un slice de chaînes :
\n\nwords := []string{"Go", "is", "awesome", "but", "only", "if", "you", "use", "the", "right", "tools"}\n\nLa méthode la plus intuitive est de parcourir le slice et d'ajouter chaque mot :
\n\nresult := ""\nfor _, w := range words {\n result += w + " "\n}\nfmt.Println(result) // "Go is awesome but only if you use the right tools "\n\nCela semble logique ? Oui. Mais c'est une bombe à retardement.
\n\nPourquoi est-ce mauvais ?
\n\n- \n
- Copie mémoire. Chaque itération crée une nouvelle chaîne, copiant toutes les données précédentes. Pour 1000 chaînes de 10 caractères, cela représente environ 500 000 copies inutiles. \n
- Nombre énorme d'allocations. Au lieu d'une seule chaîne, vous créez n chaînes, chacune étant ensuite supprimée par le ramasse-miettes. \n
- Code illisible. Il est facile d'oublier les espaces ou les séparateurs. \n
Quand est-ce acceptable ? Seulement s'il y a 2-3 chaînes et que vous écrivez un script jetable. Pour la production, jamais.
\n\nErreur n°2 : Utilisation de strings.Join avec un séparateur vide (et méconnaissance de sa puissance)
\n\nLe bon héros
\n\nLa bibliothèque standard de Go nous offre strings.Join. C'est la solution idéale dans 90% des cas :
import "strings"\n\nwords := []string{"Go", "is", "awesome"}\nresult := strings.Join(words, " ")\nfmt.Println(result) // "Go is awesome"\n\nLe code se lit comme un livre : « assemble words avec un espace ». Et il fonctionne rapidement — strings.Join calcule à l'avance la longueur finale de la chaîne et alloue la mémoire une seule fois.
Comment se trompe-t-on ?
\n\n- \n
- Oublier le séparateur.
strings.Join(words, "")— assemble tout à la suite. Parfois nécessaire, mais souvent un bug. \n - Utiliser
strings.Joinpour une concaténation unique. Ne faites pas cela :strings.Join([]string{a, b}, ""). Écrivez simplementa + b. \n - Ne pas gérer un slice vide.
strings.Join([]string{}, ",")retournera une chaîne vide. C'est normal, mais les débutants s'attendent à une erreur. \n
// Exemple où Join ne convient pas\ndata := []string{}\nresult := strings.Join(data, ",") // "" — vide, mais parfois on veut ","\n// Il faut alors faire une vérification :\nif len(data) > 0 {\n result = "," + strings.Join(data, ",")\n}\n\nConclusion : strings.Join est votre ami. Utilisez-le toujours