Comment écrivez-vous des chaînes multilignes dans Go?


Réponses:


974

Selon la spécification du langage, vous pouvez utiliser un littéral de chaîne brut, où la chaîne est délimitée par des guillemets au lieu de guillemets doubles.

`line 1
line 2
line 3`

176
En remarque: la «citation brute», comme on l'appelle, n'analyse pas les séquences d'échappement. C'est donc la chaîne littérale de choix pour écrire des modèles d'expressions régulières car ils contiennent généralement des séquences d'échappement non standard qui inciteraient le compilateur Go à se plaindre de ne pas être à double échappement. Il garde les motifs propres et relativement lisibles.
jimt

10
Vous devez cependant être prudent lorsque vous utilisez des espaces de fin. Par exemple, si vous mettez un espace après, line 1il sera invisible dans votre éditeur mais présent dans la chaîne.
Ory Band

2
@DanieleD C'est un léger non séquestre, mais quel dialecte? Vraisemblablement principalement MySQL? stackoverflow.com/a/10574031 Notez que par extension du même argument, c'est difficile d'incorporer du démarquage ou des scripts shell (si vous choisissez d'utiliser le backtick à la place de $(abcd)).
Ivan Vučica

8
@KyleHeuton: On peut supposer que Daniele D utilise le caractère de backtick dans ses requêtes SQL (comme le font souvent les utilisateurs de MySQL), et trouve pénible de devoir le représenter comme `+" `" + `et de rompre la copie et la collabilité.
ruakh

1
L'inconvénient est que si vous l'écrivez dans du code en retrait, des onglets seront inclus dans la chaîne, et si vous vous en débarrassiez, votre code serait laid. Dans de telles circonstances, je préférerais utiliser la réponse d'Azeem
Lost Crotchet

112

Tu peux écrire:

"line 1" +
"line 2" +
"line 3"

ce qui équivaut à:

"line 1line 2line3"

Contrairement à l'utilisation des tiques arrière, il préservera les caractères d'échappement. Notez que le "+" doit être sur la ligne "principale", c'est-à-dire:

"line 1"
+"line 2"

génère une erreur.


32
Cette solution n'est pas analogue aux chaînes multilignes de Python. Il fractionne le littéral de chaîne sur plusieurs lignes, mais la chaîne elle-même ne contient pas plusieurs lignes.
Ben Butler-Cole

2
Comme cela préserve les caractères d'échappement, de nouvelles lignes peuvent être simplement ajoutées avec \net il est beaucoup plus facile de travailler avec des chaînes dynamiques et autres. Si j'ai raison, la réponse acceptée est vraiment pour les chaînes statiques dans le code pour le rendre joli.
RisingSun

1
Cela ne serait-il pas très inefficace également? Soit la chaîne 3x une séquence de 6 caractères: 6 + 2 * 6 + 3 * 6 = 36 caractères alloués lorsque la valeur optimale serait 18 (puisque les chaînes sont immuables, chaque fois que vous ajoutez deux chaînes, une nouvelle chaîne est créée avec la longueur des deux cordes concaténées).
N0thing

@ N0thing: s'il n'y a que des littéraux de chaîne, il n'y a pas de différences d'exécution car le compilateur optimisera. Mais il y a une petite différence (microsecondes, voire nanosecondes) dans le temps de compilation.
dolmen

Je crois que c'est la meilleure façon d'obtenir un littéral de chaîne multiligne avec des fins de ligne CRLF
ldanilek

39

Des littéraux de chaîne :

  • le littéral de chaîne brut prend en charge le multiligne (mais les caractères d'échappement ne sont pas interprétés)
  • littéral de chaîne interprété interpréter les caractères échappés, comme ' \n'.

Mais, si votre chaîne multi-lignes doit inclure une citation arrière (`), alors vous devrez utiliser un littéral de chaîne interprété:

`line one
  line two ` +
"`" + `line three
line four`

Vous ne pouvez pas mettre directement un guillemet arrière (`) dans un littéral de chaîne brute (` `xx \).
Vous devez utiliser (comme expliqué dans " comment mettre un backquote dans une chaîne backquoted? "):

 + "`" + ...

33

Utilisez des littéraux de chaîne bruts pour les chaînes multilignes:

func main(){
    multiline := `line 
by line
and line
after line`
}

Littéraux de chaîne bruts

Les littéraux de chaîne bruts sont des séquences de caractères entre guillemets, comme dans `foo`. Dans les guillemets, n'importe quel caractère peut apparaître sauf les guillemets arrière.

Une partie importante est que le littéral brut n'est pas seulement multi-lignes et être multi-lignes n'est pas le seul but de celui-ci.

La valeur d'un littéral de chaîne brute est la chaîne composée des caractères non interprétés (implicitement encodés en UTF-8) entre les guillemets; en particulier, les barres obliques inverses n'ont pas de signification particulière ...

Les échappements ne seront donc pas interprétés et les nouvelles lignes entre les ticks seront de véritables nouvelles lignes .

func main(){
    multiline := `line 
by line \n
and line \n
after line`

    // \n will be just printed. 
    // But new lines are there too.
    fmt.Print(multiline)
}

Enchaînement

Vous avez peut-être une longue ligne que vous voulez rompre et vous n'avez pas besoin de nouvelles lignes. Dans ce cas, vous pouvez utiliser la concaténation de chaînes.

func main(){
    multiline := "line " +
            "by line " +
            "and line " +
            "after line"

    fmt.Print(multiline) // No new lines here
}

Puisque "" est interprété, les échappements littéraux de chaîne seront interprétés.

func main(){
    multiline := "line " +
            "by line \n" +
            "and line \n" +
            "after line"

    fmt.Print(multiline) // New lines as interpreted \n
}

12

Go et chaînes multilignes

En utilisant les ticks arrière, vous pouvez avoir des chaînes multilignes:

package main

import "fmt"

func main() {

    message := `This is a 
Multi-line Text String
Because it uses the raw-string back ticks 
instead of quotes.
`

    fmt.Printf("%s", message)
}

Au lieu d'utiliser les guillemets doubles («) ou les symboles de guillemets simples ('), utilisez plutôt des graduations pour définir le début et la fin de la chaîne. Vous pouvez ensuite l'enrouler sur plusieurs lignes.

Si vous indentez la chaîne, n'oubliez pas que l'espace blanc comptera.

Veuillez vérifier le terrain de jeu et faire des expériences avec.


4

Vous pouvez mettre du contenu avec `` autour de lui, comme

var hi = `I am here,
hello,
`

3

Vous devez être très prudent sur le formatage et l'espacement des lignes dans go, tout compte et voici un exemple de travail, essayez-le https://play.golang.org/p/c0zeXKYlmF

package main

import "fmt"

func main() {
    testLine := `This is a test line 1
This is a test line 2`
    fmt.Println(testLine)
}

3

vous pouvez utiliser des littéraux bruts. Exemple

s:=`stack
overflow`

0

Pour moi, c'est ce que j'utilise si l'ajout \nn'est pas un problème.

fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")

Sinon, vous pouvez utiliser le raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.