Jak pisać ciągi Wielowierszowe w Go?

Czy Go ma coś podobnego do ciągów wielowierszowych Pythona:

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

Jeśli nie, jaki jest preferowany sposób pisania łańcuchów obejmujących wiele linii?

 435
go
Author: aeter, 2011-10-28

7 answers

Zgodnie ze specyfikacją języka można użyć surowego ciągu znaków, gdzie łańcuch jest oddzielany za pomocą backticks zamiast podwójnych cudzysłowów.

`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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 10:43:17

Możesz napisać:

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

Czyli to samo co:

"line 1line 2line3"

W przeciwieństwie do używania tylnych kleszczy, zachowuje znaki ucieczki. Zauważ, że " + "musi znajdować się w linii' wiodącej', tj.:

"line 1"
+"line 2"

Generuje błąd.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 06:26:54

From string literals :

  • surowy ciąg znaków obsługuje wiele linii (ale znaki z klauzulą odstępu nie są interpretowane)
  • interpretowany ciąg znaków literalnie interpretuje znaki ucieczki, takie jak " \n".

Ale jeśli twój łańcuch wielowierszowy musi zawierać backquote ( ` ), to będziesz musiał użyć interpretowanego literału łańcuchowego:

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

Nie można bezpośrednio umieścić backquote (`) w surowym łańcuchu znaków ("xx \).
Musisz użyć (jak wyjaśniono w "Jak umieścić backquote w backquoted string?"):

 + "`" + ...
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:26

Użyj nieprzetworzonych liter ciągów dla ciągów wielowierszowych:

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

Surowe literały ciągów

Surowe literały łańcuchowe są sekwencjami znaków pomiędzy tylnymi cudzysłowami, jak w foo. W cudzysłowach może pojawić się dowolny znak, z wyjątkiem back quote.

Znaczącą częścią jest to, że jest surowy literalny, a nie tylko wielowierszowy i być wielowierszowym nie jest jedynym celem tego.

Wartość surowego ciągu literalnego jest ciągiem składającym się z nieprzetworzonego znaki między cudzysłowami (w domyśle kodowane UTF-8); w szczególności ukośniki zwrotne nie mają specjalnego znaczenia...

Więc ucieczki nie będą interpretowane, a nowe linie między kleszczami będą nowymi liniami.

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

Konkatenacja

Prawdopodobnie masz długą linię, którą chcesz złamać i nie potrzebujesz w niej nowych linii. W tym przypadku można użyć konkatenacji łańcuchów.

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

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

Ponieważ "" jest interpretowany literalny ciąg znaków będzie interpretowane.

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 07:15:58

Możesz umieścić treść z ` wokół niego, jak

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-24 01:50:54

Musisz być bardzo ostrożny przy formatowaniu i odstępach między wierszami w go, wszystko się liczy i oto próbka robocza, spróbuj 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 23:17:37

Możesz używać surowych liter. Przykład

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 08:41:34