Chaînes multilignes en Go : les pièges qui guettent même les développeurs expérimentés
Imaginez la situation : vous écrivez en Go une requête SQL, un modèle JSON ou simplement un long message pour un journal. Vous appuyez intuitivement sur Entrée pour passer à la ligne, et… le compilateur affiche une erreur. Cela vous dit quelque chose ? La question "How do you write multiline strings in Go?" sur Stack Overflow a rassemblé des milliers de vues pour une bonne raison. C'est l'un de ces petits détails qui peuvent déstabiliser même ceux qui maîtrisent déjà la syntaxe du langage.
Dans cet article, nous analyserons le top 5 des erreurs fatales lors du travail avec les chaînes multilignes en Go et montrerons comment les éviter. Vous découvrirez la différence entre les littéraux interprétés et bruts, pourquoi un espace supplémentaire peut vous gâcher la journée et comment formater correctement votre code. C'est parti !
Erreur n°1 : Utilisation des guillemets doubles pour un texte multiligne
L'erreur la plus courante chez les débutants est d'essayer d'écrire une chaîne multiligne entre guillemets doubles ("). En Go, les guillemets doubles créent un littéral de chaîne interprété. Cela signifie que le caractère de saut de ligne à l'intérieur est interdit.
// Ce code NE se compilera PASpackage main
import "fmt"
func main() { // Erreur : unexpected newline in string literal message := "Bonjour, monde !" fmt.Println(message)}Le compilateur Go est strict : il voit un guillemet non fermé et un caractère de nouvelle ligne, ce qui provoque une erreur de syntaxe. Souvenez-vous : les guillemets doubles sont réservés aux chaînes sur une seule ligne.
Erreur n°2 : Ignorer les littéraux de chaîne bruts (raw string literals)
La solution au problème des multilignes est d'utiliser les littéraux de chaîne bruts. Ils sont créés avec des guillemets inversés (`). À l'intérieur, tous les caractères sont interprétés littéralement, y compris les sauts de ligne, les tabulations et même les barres obliques inverses.
// La bonne méthode : utiliser les guillemets inverséspackage main
import "fmt"
func main() { message := `Bonjour,monde !` fmt.Println(message)}// Sortie :// Bonjour,// monde !C'est la solution idéale pour les requêtes SQL, le JSON, les modèles HTML et tout autre texte où la structure est importante. Cependant, une autre erreur se cache ici.
Erreur n°3 : Espaces et indentations superflus dans les chaînes brutes
Lorsque vous écrivez du code, vous le formatez avec des indentations pour le rendre lisible. Mais si vous insérez une chaîne multiligne directement dans le corps d'une fonction avec des indentations, ces indentations deviennent partie intégrante de la chaîne.
// Exemple avec des espaces "superflus"package main
import "fmt"
func main() { query := ` SELECT id, name FROM users WHERE active = true ` fmt.Println(query)}// Sortie (notez les espaces de début) ://// SELECT id, name// FROM users// WHERE active = true// La première ligne de la sortie est vide (car le saut de ligne après le guillemet ouvrant), et chaque ligne suivante commence par 8 espaces. Cela peut casser la logique si la chaîne est utilisée, par exemple, dans os.Exec ou lors d'une comparaison.
Comment l'éviter ? Il y a deux façons. La première est d'écrire la chaîne sans indentation, directement contre la marge :
query := `SELECT id, nameFROM usersWHERE active = true`La seconde est d'utiliser la concaténation ou strings.TrimSpace. Mais le plus simple est de s'habituer à ne pas faire d'indentation à l'intérieur des chaînes brutes si elles sont critiques. Pour les requêtes SQL, ce n'est souvent pas un problème, mais pour les journaux ou les messages utilisateur, cela peut être fatal.
Erreur n°4 : Oublier l'échappement dans les chaînes brutes
Les chaînes brutes ne prennent pas en charge les séquences d'échappement. Cela signifie que entre guillemets inversés est simplement deux caractères : une barre oblique inverse et la lettre 'n', et non un saut de ligne.
package main
import "fmt"