Как вы пишете многострочные строки в Go?

612

Есть ли в Go что-нибудь похожее на многострочные строки Python:

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

Если нет, то какой способ записи строк занимает несколько строк?

aeter
источник
Ссылка stackoverflow.com/questions/32042989/…
Лалит Шарма

Ответы:

974

В соответствии со спецификацией языка вы можете использовать необработанный строковый литерал, где строка отделяется обратными кавычками вместо двойных кавычек.

`line 1
line 2
line 3`
Марк Байерс
источник
176
В качестве примечания: «Необработанная цитата», как она называется, не анализирует escape-последовательности. Поэтому строковый литерал предпочтителен для написания шаблонов регулярных выражений, поскольку они обычно содержат нестандартные escape-последовательности, которые заставили бы компилятор Go жаловаться на то, что он не был дважды экранирован. Он сохраняет шаблоны чистыми и относительно читаемыми.
Джимт
10
Нужно быть осторожным с этим при использовании конечных пробелов. Например, если вы поставите пробел после line 1того, как он будет невидимым в вашем редакторе, но присутствует в строке.
Ory Band
2
@DanieleD Это небольшое несоответствие, но какой диалект? Предположительно в основном MySQL? stackoverflow.com/a/10574031 Обратите внимание, что из-за расширения одного и того же аргумента сложно внедрить уценку или сценарии оболочки (если вы решите использовать backtick вместо $(abcd)).
Иван Вучица,
8
@KyleHeuton: Предположительно, Даниэль D использует символ обратного течения в своих SQL-запросах (как это часто делают пользователи MySQL) и считает болезненным необходимость представлять его как `+" `" + `и нарушать возможность копирования и вставки.
Руах
1
Обратной стороной этого является то, что если вы пишете его внутри кода с отступом, вкладки будут включены в строку, и избавление от них сделает ваш код уродливым. При таких обстоятельствах я предпочел бы использовать ответ Азима
Lost Crotchet
112

Ты можешь написать:

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

что так же, как:

"line 1line 2line3"

В отличие от использования обратных тиков, он сохранит escape-символы. Обратите внимание, что «+» должен быть в «ведущей» строке, то есть:

"line 1"
+"line 2"

генерирует ошибку.

mddkpp на gmail.com
источник
32
Это решение не аналогично многострочным строкам Python. Он разбивает строковый литерал на несколько строк, но сама строка не содержит нескольких строк.
Бен Батлер-Коул
2
Поскольку это сохраняет escape-символы, новые строки могут быть просто добавлены, \nи намного проще работать с динамическими строками и тому подобным. Если я прав, принятый ответ действительно для статических строк в коде, чтобы он выглядел красиво.
RisingSun
1
Разве это не будет очень неэффективно? Пусть строка будет 3x последовательность из 6 символов: 6 + 2 * 6 + 3 * 6 = 36 символов, выделенных, когда оптимальным будет 18 (поскольку строки неизменяемы, каждый раз, когда вы добавляете две строки, создается новая строка с длиной двух соединенные строки).
ничего
@ N0thing: если есть только строковые литералы, нет различий во время выполнения, так как компилятор будет оптимизировать. Но есть небольшая (микросекунды или даже наносекунды) разница во времени компиляции.
дольмен
Я считаю, что это лучший способ получить многострочный строковый литерал с окончаниями строк CRLF
ldanilek
39

Из строковых литералов :

  • Необработанный строковый литерал поддерживает многострочный (но экранированные символы не интерпретируются)
  • интерпретируемый строковый литерал интерпретирует экранированные символы, например ' \n'.

Но если ваша многострочная строка должна содержать обратную кавычку (`), вам придется использовать интерпретируемый строковый литерал:

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

Вы не можете напрямую поместить обратную цитату (`) в необработанный строковый литерал (` `xx \).
Вы должны использовать (как объясняется в разделе « Как поместить обратную цитату в строку с обратной кавычкой? »):

 + "`" + ...
VonC
источник
33

Используйте необработанные строковые литералы для многострочных строк:

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

Необработанные строковые литералы

Необработанные строковые литералы являются символьными последовательностями между кавычками, как в `foo`. В кавычках может появляться любой символ, кроме обратной кавычки.

Значительная часть заключается в том, что необработанный литерал не просто многострочный, и быть многострочным - не единственная цель этого.

Значение необработанного строкового литерала - это строка, состоящая из неинтерпретированных (неявно кодированных в UTF-8) символов между кавычками; в частности, обратная косая черта не имеет особого значения ...

Таким образом, экранирование не будет интерпретироваться, и новые строки между галочками будут настоящими новыми линиями .

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

конкатенация

Возможно, у вас есть длинная линия, которую вы хотите разорвать, и вам не нужны новые строки в ней. В этом случае вы можете использовать конкатенацию строк.

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

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

Так как "" интерпретируется, строковые литералы будут интерпретироваться.

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

    fmt.Print(multiline) // New lines as interpreted \n
}
I159
источник
12

Go и многострочные строки

Используя обратные галочки, вы можете иметь многострочные строки:

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

Вместо использования символов двойной кавычки («) или одинарных кавычек ('), вместо этого используйте обратные галочки для определения начала и конца строки. Затем вы можете обернуть его через строки.

Если вы сделаете отступ в строке, помните, что пробел будет учитываться.

Пожалуйста, проверьте игровую площадку и проведите эксперименты с ней.

АШВИН РАДЖЕЕВ
источник
4

Вы можете поместить контент с `` вокруг него, как

var hi = `I am here,
hello,
`
Лиам
источник
3

Вы должны быть очень осторожны с форматированием и межстрочным интервалом в go, все имеет значение, и вот рабочий пример, попробуйте его 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

Вы можете использовать сырые литералы. пример

s:=`stack
overflow`
Прабеш П
источник
0

Для меня это то, что я использую, если добавление \nне является проблемой.

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

Еще вы можете использовать raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Офоним франциск
источник