Come si scrivono stringhe multilinea in Go?


Risposte:


974

In base alle specifiche del linguaggio è possibile utilizzare un valore letterale di stringa non elaborato, in cui la stringa è delimitata da backtick anziché da doppie virgolette.

`line 1
line 2
line 3`

176
Come nota a margine: la "citazione non elaborata" come viene chiamata, non analizza le sequenze di escape. È quindi per la stringa letterale di scelta scrivere schemi di espressioni regolari poiché di solito contengono sequenze di escape non standard che farebbero lamentare il compilatore Go non con doppio escape. Mantiene i modelli puliti e relativamente leggibili.
jimt

10
Bisogna fare attenzione con questo quando si utilizzano gli spazi di fine linea. Ad esempio se inserisci uno spazio dopo line 1sarà invisibile nel tuo editor ma presente nella stringa.
Ory Band,

2
@DanieleD Questo è un leggero nonsequitur, ma quale dialetto? Presumibilmente principalmente MySQL? stackoverflow.com/a/10574031 Si noti che per estensione dello stesso argomento, è un problema per l'incorporamento di markdown o script di shell (se si sceglie di utilizzare il backtick al posto di $(abcd)).
Ivan Vučica,

8
@KyleHeuton: Presumibilmente Daniele D sta usando il carattere backtick nelle sue query SQL (come fanno spesso gli utenti MySQL), e trova doloroso doverlo rappresentare come `+" `" + `e interrompere copia-e-pastabilità.
ruakh,

1
Il lato negativo di questo è che se lo stai scrivendo all'interno di un codice rientrato, le schede saranno incluse nella stringa e, eliminandole, il tuo codice sembrerebbe brutto. In tali circostanze, preferirei usare la risposta di Azeem
Lost Crotchet,

112

Tu puoi scrivere:

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

che è lo stesso di:

"line 1line 2line3"

Diversamente dall'utilizzo di tick posteriori, conserverà i caratteri di escape. Si noti che "+" deve trovarsi sulla riga "iniziale", ovvero:

"line 1"
+"line 2"

genera un errore.


32
Questa soluzione non è analoga alle stringhe multilinea di Python. Divide letteralmente la stringa su più righe, ma la stringa stessa non contiene più righe.
Ben Butler-Cole,

2
Poiché ciò preserva i caratteri di escape, è possibile aggiungere semplicemente nuove linee \ned è molto più semplice lavorare con stringhe dinamiche e simili. Se ho ragione, la risposta accettata è davvero per stringhe statiche nel codice per renderlo carino.
RisingSun

1
Non sarebbe anche molto inefficiente? Lascia che la stringa sia 3x una sequenza di 6 caratteri: 6 + 2 * 6 + 3 * 6 = 36 caratteri allocati quando ottimale sarebbe 18 (poiché le stringhe sono immutabili, ogni volta che aggiungi due stringhe viene creata una nuova stringa con lunghezza delle due stringhe concatenate).
N0thing

@ N0thing: se ci sono solo valori letterali di stringa, non ci sono differenze di runtime in quanto il compilatore ottimizzerà. Ma c'è una piccola differenza (microsecondi o addirittura nanosecondi) nel tempo di compilazione.
dolmen,

Credo che questo sia il modo migliore per ottenere una stringa multilinea letterale con terminazioni di linea CRLF
ldanilek,

39

Dai letterali String :

  • il valore letterale stringa non elaborata supporta multilinea (ma i caratteri di escape non vengono interpretati)
  • stringa interpretata interpretare letteralmente caratteri di escape, come " \n".

Ma, se la tua stringa multilinea deve includere un backquote (`), dovrai usare una stringa interpretata letterale:

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

Non è possibile inserire direttamente un backquote (`) in un valore letterale stringa grezzo (` `xx \).
Devi usare (come spiegato in " come mettere un backquote in una stringa backquoted? "):

 + "`" + ...

33

Usa valori letterali di stringa non elaborati per le stringhe multilinea:

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

Letterali stringa grezzi

I letterali di stringa grezzi sono sequenze di caratteri tra virgolette, come in `foo`. All'interno delle virgolette, può apparire qualsiasi personaggio tranne la virgoletta.

Una parte significativa è che il raw letterale non è solo multi-linea e essere multi-linea non è l'unico scopo di esso.

Il valore di una stringa non elaborata letterale è la stringa composta dai caratteri non interpretati (implicitamente codificati in UTF-8) tra le virgolette; in particolare, le barre rovesciate non hanno un significato speciale ...

Quindi le fughe non saranno interpretate e le nuove linee tra le zecche saranno vere nuove linee .

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

Concatenazione

Forse hai una linea lunga che vuoi spezzare e non hai bisogno di nuove linee. In questo caso è possibile utilizzare la concatenazione di stringhe.

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

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

Poiché "" viene interpretato, la stringa viene letteralmente interpretata come escape.

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

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

12

Vai e stringhe multilinea

Usando i segni di spunta posteriori puoi avere stringhe multilinea:

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

Invece di utilizzare la virgoletta doppia (“) o i simboli di virgoletta singola ('), utilizzare invece i segni di spunta per definire l'inizio e la fine della stringa. È quindi possibile avvolgerlo attraverso le linee.

Se indentate la stringa, ricordate che lo spazio bianco verrà conteggiato.

Si prega di controllare il parco giochi e fare esperimenti con esso.


4

Puoi mettere il contenuto con `` attorno ad esso, come

var hi = `I am here,
hello,
`

3

Devi fare molta attenzione alla formattazione e alla spaziatura tra le righe, tutto conta e qui c'è un esempio funzionante, provalo 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

puoi usare letterali grezzi. Esempio

s:=`stack
overflow`

0

Per me questo è quello che uso se l'aggiunta \nnon è un problema.

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

Altrimenti puoi usare il raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.