¿Cómo se escriben cadenas multilíneas en Go?


Tiene algo similar a las cadenas multilínea de python:

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

Si no, ¿cuál es la forma preferida de escribir cadenas que abarcan varias líneas?

 435
go
Author: aeter, 2011-10-28

7 answers

De acuerdo con la especificación del lenguaje puede usar un literal de cadena sin procesar, donde la cadena está delimitada por palancas en lugar de comillas dobles.

`line 1
line 2
line 3`
 722
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 10:43:17

Puedes escribir:

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

Que es lo mismo que:

"line 1line 2line3"

A diferencia del uso de marcas de retroceso, preservará los caracteres de escape. Tenga en cuenta que el " + "debe estar en la línea 'inicial', es decir:

"line 1"
+"line 2"

Genera un error.

 75
Author: mddkpp at gmail.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-26 06:26:54

De literales de Cadena:

  • el literal de cadena raw admite multilínea (pero los caracteres escapados no se interpretan)
  • interpreted string literal interpreta caracteres escapados, como '\n'.

Pero, si tu cadena de varias líneas tiene que incluir una backquote (`), entonces tendrás que usar un literal de cadena interpretado:

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

No se puede poner directamente una backquote (`) en un literal de cadena raw (`xx\).
Usted tiene que utilizar (como se explica en " ¿cómo poner un backquote en una cadena backquoted?"):

 + "`" + ...
 25
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:26

Use literales de cadena sin procesar para cadenas de varias líneas:

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

Literales de cadena sin procesar

Los literales de cadena sin procesar son secuencias de caracteres entre comillas, como en foo. Dentro de las comillas, puede aparecer cualquier carácter excepto la comilla invertida.

Una parte significativa es que es raw literal no solo multilínea y ser multilínea no es el único propósito de ello.

El valor de un literal de cadena raw es la cadena compuesta por el no interpretado (implícitamente codificado en UTF-8) los caracteres entre las comillas; en particular, las barras invertidas no tienen un significado especial...

Así que los escapes no se interpretarán y las nuevas líneas entre marcas serán verdaderas nuevas líneas.

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

Concatenación

Posiblemente tenga una línea larga que desea romper y no necesita nuevas líneas en ella. En este caso se podría utilizar la concatenación de cadenas.

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

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

Dado que "" se interpreta cadena, los escapes literales serán interpretar.

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

    fmt.Print(multiline) // New lines as interpreted \n
}
 16
Author: I159,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 07:15:58

Puedes poner contenido con " a su alrededor, como

var hi = `I am here,
hello,
`
 4
Author: liam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-24 01:50:54

Hay que tener mucho cuidado con el formato y el espaciado de líneas en go, todo cuenta y aquí hay una muestra de trabajo, pruébelo 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
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-29 23:17:37

Puede usar literales crudos. Ejemplo

s:=`stack
overflow`
 0
Author: Prabesh P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-24 08:41:34