Como você escreve strings de várias linhas no Go?

612

O Go tem algo parecido com as seqüências multilinhas do Python:

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

Caso contrário, qual é a maneira preferida de escrever strings que abrangem várias linhas?

aeter
fonte

Respostas:

973

De acordo com a especificação da linguagem, você pode usar uma literal de cadeia de caracteres bruta, onde a cadeia de caracteres é delimitada por backticks em vez de aspas duplas.

`line 1
line 2
line 3`
Mark Byers
fonte
176
Como observação lateral: A 'cotação bruta', como é chamada, não analisa seqüências de escape. É, portanto, a string literal de escolha para escrever padrões de expressão regular, pois geralmente contêm seqüências de escape não padrão que fariam o compilador Go se queixar de não ter escapado duas vezes. Mantém os padrões limpos e relativamente legíveis.
jimt
10
Porém, é preciso ter cuidado com isso ao usar espaços de linha de extremidade. Por exemplo, se você colocar um espaço depois line 1dele ficará invisível no seu editor, mas presente na string.
Ory Banda
2
@DanieleD Esse é um ligeiro nonsequitur, mas qual dialeto? Presumivelmente principalmente MySQL? stackoverflow.com/a/10574031 Observe que, por extensão do mesmo argumento, é muito difícil incorporar markdown ou scripts de shell (se você optar por usar o backtick no lugar de $(abcd)).
Ivan Vučica
8
@KyleHeuton: Presumivelmente, Daniele D está usando o caractere backtick em suas consultas SQL (como os usuários do MySQL costumam fazer), e acha doloroso ter que representá-lo como `+" `" + `e interromper a cópia e pastabilidade.
Ruakh
1
O lado negativo disso é que, se você o escrever dentro do código recuado, as guias serão incluídas na string e se livrar delas fará com que seu código fique feio. Sob tais circunstâncias, eu preferiria usar a resposta de Azeem
Perdido Crotchet
111

Você pode escrever:

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

que é o mesmo que:

"line 1line 2line3"

Ao contrário do uso de ticks anteriores, ele preservará os caracteres de escape. Observe que o "+" deve estar na linha 'principal', ou seja:

"line 1"
+"line 2"

gera um erro.

mddkpp em gmail.com
fonte
32
Esta solução não é análoga às seqüências multilinhas do Python. Divide a string literal em várias linhas, mas a própria string não contém várias linhas.
Ben Butler-Cole
2
Como isso preserva os caracteres de escape, novas linhas podem ser simplesmente adicionadas \ne é muito mais fácil trabalhar com seqüências dinâmicas. Se eu estiver correto, a resposta aceita é realmente para cadeias estáticas no código para torná-la bonita.
RisingSun 02/02
1
Isso não seria muito ineficiente também? Seja a sequência 3x uma seqüência de 6 caracteres: 6 + 2 * 6 + 3 * 6 = 36 caracteres alocados quando o ideal seria 18 (como as strings são imutáveis, toda vez que você adiciona duas strings, uma nova string é criada com o comprimento das duas cadeias concatenadas).
N0thing
@ N0thing: se houver apenas literais de string, não haverá diferenças de tempo de execução, pois o compilador será otimizado. Mas há uma pequena diferença (microssegundos ou mesmo nanossegundos) no tempo de compilação.
anta
Eu acredito que esta é a melhor maneira de obter um literal de cadeia multilinha com fins de linha CRLF
ldanilek
39

Dos literais String :

  • literal de cadeia bruta suporta múltiplas linhas (mas caracteres de escape não são interpretados)
  • string interpretada literal interpretar caracteres de escape, como ' \n'.

Mas, se sua string de várias linhas precisar incluir uma citação (`), será necessário usar uma literal de string interpretada:

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

Você não pode colocar diretamente uma nota de retorno (`) em uma literal de string bruta (` `xx \).
Você precisa usar (como explicado em " como colocar uma cota retroativa em uma string com cota retroativa? "):

 + "`" + ...
VonC
fonte
33

Use literais de cadeia bruta para cadeias de linhas múltiplas:

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

Literais de cadeia bruta

Literais de cadeia bruta são sequências de caracteres entre aspas, como em `foo`. Dentro das aspas, qualquer caractere pode aparecer, exceto as aspas.

Uma parte significativa é que o literal bruto não é apenas multi-linhas e ser multi-linhas não é o único objetivo disso.

O valor de uma literal de sequência bruta é a sequência composta pelos caracteres não interpretados (implicitamente codificados em UTF-8) entre as aspas; em particular, as barras invertidas não têm significado especial ...

Portanto, escapes não serão interpretados e novas linhas entre os ticks serão novas linhas reais .

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

Concatenação

Possivelmente você tem uma linha longa que deseja quebrar e não precisa de novas linhas. Nesse caso, você pode usar a concatenação de cadeias.

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

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

Como "" é interpretado, as fugas literais da sequência serão interpretadas.

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

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

Ir e seqüências de linhas múltiplas

Usando back ticks, você pode ter cadeias de linhas múltiplas:

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

Em vez de usar aspas duplas (“) ou símbolos de aspas simples ('), use marcações de retorno para definir o início e o fim da string. Você pode então envolvê-lo nas linhas.

Se você recuar a string, lembre-se de que o espaço em branco será contado.

Por favor, verifique o playground e faça experiências com ele.

ASHWIN RAJEEV
fonte
4

Você pode colocar conteúdo com `` em torno dele, como

var hi = `I am here,
hello,
`
liam
fonte
3

Você precisa ter muito cuidado com a formatação e o espaçamento entre linhas, tudo conta e aqui está uma amostra de trabalho, tente 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)
}
David
fonte
3

você pode usar literais brutos. Exemplo

s:=`stack
overflow`
Prabesh P
fonte
0

Para mim, é isso que eu uso se adicionar \nnão for um problema.

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

Caso contrário, você pode usar o raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Ofonime Francis
fonte