Wie schreibt man mehrzeilige Strings in Go?


Antworten:


973

Entsprechend der Sprachspezifikation können Sie ein Rohzeichenfolgenliteral verwenden, bei dem die Zeichenfolge durch Backticks anstelle von doppelten Anführungszeichen begrenzt wird.

`line 1
line 2
line 3`

176
Als Randnotiz: Das so genannte "rohe Zitat" analysiert keine Escape-Sequenzen. Es ist daher das Zeichenfolgenliteral der Wahl, Muster für reguläre Ausdrücke zu schreiben, da diese normalerweise nicht standardmäßige Escape-Sequenzen enthalten, die den Go-Compiler dazu bringen würden, sich über nicht doppelt maskierte zu beschweren. Es hält die Muster sauber und relativ lesbar.
Jimt

10
Seien Sie jedoch vorsichtig, wenn Sie Endline-Leerzeichen verwenden. Wenn Sie beispielsweise ein Leerzeichen einfügen, ist line 1es in Ihrem Editor unsichtbar, aber in der Zeichenfolge vorhanden.
Ory Band

2
@ DanieleD Das ist eine leichte Folge, aber welcher Dialekt? Vermutlich hauptsächlich MySQL? stackoverflow.com/a/10574031 Beachten Sie, dass es durch Erweiterung desselben Arguments schwierig ist , Markdown- oder Shell-Skripte einzubetten (wenn Sie Backtick anstelle von verwenden $(abcd)).
Ivan Vučica

8
@KyleHeuton: Vermutlich verwendet Daniele D das Backtick-Zeichen in seinen SQL-Abfragen (wie es MySQL-Benutzer häufig tun) und findet es schmerzhaft, es als "+" "+" darstellen zu müssen und die Kopier- und Pastierbarkeit zu unterbrechen.
Ruakh

1
Der Nachteil dabei ist, dass beim Schreiben in eingerückten Code Tabulatoren in die Zeichenfolge aufgenommen werden. Wenn Sie diese entfernen, sieht Ihr Code hässlich aus. Unter solchen Umständen würde ich lieber
Lost Crotchet

111

Du kannst schreiben:

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

Das ist das gleiche wie:

"line 1line 2line3"

Im Gegensatz zur Verwendung von Back-Ticks bleiben Escape-Zeichen erhalten. Beachten Sie, dass das "+" in der 'führenden' Zeile stehen muss, dh:

"line 1"
+"line 2"

erzeugt einen Fehler.


32
Diese Lösung ist nicht analog zu Pythons mehrzeiligen Zeichenfolgen. Das Zeichenfolgenliteral wird auf mehrere Zeilen aufgeteilt, die Zeichenfolge selbst enthält jedoch nicht mehrere Zeilen.
Ben Butler-Cole

2
Da dadurch Escapezeichen erhalten bleiben, können neue Zeilen einfach hinzugefügt werden \nund es ist viel einfacher, mit dynamischen Zeichenfolgen und dergleichen zu arbeiten. Wenn ich richtig bin, ist die akzeptierte Antwort wirklich, dass statische Zeichenfolgen im Code hübsch aussehen.
RisingSun

1
Wäre das nicht auch sehr ineffizient? Die Zeichenfolge sei 3x eine 6-Zeichen-Sequenz: 6 + 2 * 6 + 3 * 6 = 36 Zeichen, die zugewiesen werden, wenn das Optimum 18 beträgt (da Zeichenfolgen unveränderlich sind, wird jedes Mal, wenn Sie zwei Zeichenfolgen hinzufügen, eine neue Zeichenfolge mit der Länge der beiden Zeichen erstellt verkettete Zeichenfolgen).
Nichts

@ N0thing: Wenn nur String-Literale vorhanden sind, gibt es keine Laufzeitunterschiede, da der Compiler optimiert. Es gibt jedoch einen kleinen Unterschied (Mikrosekunden oder sogar Nanosekunden) in der Kompilierungszeit.
Dolmen

Ich glaube, dies ist der beste Weg, um ein mehrzeiliges String-Literal mit CRLF-Zeilenenden zu erhalten
ldanilek

39

Aus String-Literalen :

  • Das Raw-String-Literal unterstützt mehrzeilige Zeichen (maskierte Zeichen werden jedoch nicht interpretiert).
  • interpretiertes String-Literal interpretiert maskierte Zeichen wie ' \n'.

Wenn Ihre mehrzeilige Zeichenfolge jedoch ein Backquote (`) enthalten muss, müssen Sie ein interpretiertes Zeichenfolgenliteral verwenden:

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

Sie können ein Backquote (`) nicht direkt in ein Raw-String-Literal (` `xx \) einfügen .
Sie müssen Folgendes verwenden (wie unter " Wie füge ich ein Backquote in eine Backquote ein? " Erläutert ):

 + "`" + ...

33

Verwenden Sie rohe String-Literale für mehrzeilige Strings:

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

Rohe String-Literale

Rohe String-Literale sind Zeichenfolgen zwischen Anführungszeichen wie in `foo`. Innerhalb der Anführungszeichen kann jedes Zeichen außer dem hinteren Anführungszeichen erscheinen.

Ein wesentlicher Teil ist, dass rohes Literal nicht nur mehrzeilig ist und dass es nicht der einzige Zweck ist, mehrzeilig zu sein.

Der Wert eines rohen Zeichenfolgenliteral ist die Zeichenfolge, die aus den nicht interpretierten (implizit UTF-8-codierten) Zeichen zwischen den Anführungszeichen besteht. Insbesondere Backslashes haben keine besondere Bedeutung ...

Escapezeichen werden also nicht interpretiert und neue Linien zwischen Ticks sind echte neue Linien .

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)
}

Verkettung

Möglicherweise haben Sie eine lange Leitung, die Sie unterbrechen möchten, und Sie benötigen keine neuen Zeilen. In diesem Fall können Sie die Zeichenfolgenverkettung verwenden.

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

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

Da "" interpretiert wird, werden String-Literal-Escapezeichen interpretiert.

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

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

12

Gehen Sie und mehrzeilige Zeichenfolgen

Mit Back Ticks können Sie mehrzeilige Zeichenfolgen haben:

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)
}

Verwenden Sie statt der doppelten Anführungszeichen (“) oder der einfachen Anführungszeichen (') Back-Ticks, um den Anfang und das Ende der Zeichenfolge zu definieren. Sie können es dann über Linien wickeln.

Wenn Sie die Zeichenfolge einrücken, denken Sie daran, dass der Leerraum zählt.

Bitte überprüfen Sie den Spielplatz und experimentieren Sie damit.


4

Sie können Inhalte mit `` darum setzen, wie

var hi = `I am here,
hello,
`

3

Sie müssen beim Formatieren und beim Zeilenabstand sehr vorsichtig sein, alles zählt und hier ist ein funktionierendes Beispiel. Probieren Sie es aus: 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

Sie können rohe Literale verwenden. Beispiel

s:=`stack
overflow`

0

Für mich ist dies das, was ich benutze, wenn das Hinzufügen \nkein Problem ist.

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

Sonst können Sie die verwenden raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.